2009-03-12 2 views
36

Есть ли способ узнать, работает ли текущий пользователь сеанса Xserver (под Linux)?Как проверить, запущен ли сервер X?

I'v начал с таких вещей, как:

ps -e | grep X 

, но это не работает всегда

и еще одна вещь, которую я попытался проверяет $DISPLAY переменная

Есть ли другие способы проверить это?

EDIT: Некоторые люди предложили использовать переменные $ DISPLAY, но что делать, если пользователь спрятал эту переменную? что, если он пытается что-то сделать и изменяет эту переменную, а затем, когда я ее проверю, он больше не отражает точное состояние системы. Нет ли конкретного способа сделать это, который всегда вернет правильный ответ?

я обнаружил, что это может быть сделано таким образом программно:

#include <X11/Xlib.h> 
int main() 
    { exit(XOpenDisplay(NULL) ? 0 : 1); } 

$ gcc -o xprobe xprobe.c -L/usr/X11R6/lib -lX11 

Но я искал способ сценария.

+1

почему не «пс -e | grep X "всегда работает? – stephendl

+2

И почему не работает $ DISPLAY? –

+0

@stephendl: Я обнаружил, что в некоторых ситуациях X работает, но пользователь подключается через терминал без X @matthew: Что делать, если пользователь возится с эта переменная, и она больше не отражает фактическое состояние системы? –

ответ

6

Я использую

pidof X && echo "yup X server is running" 

pgrep и $ DISPLAY другие варианты.

Другие соображения:

су то $ DISPLAY не будет установлен. Вещи, которые изменяют среду работы программы, могут сделать это неэффективным.

Я не рекомендую ps -e | grep X, так как это найдет procX, который не является X-сервером.

+0

Разве это не так, как ps - e | grep X? AFAIK pidof просто псевдоним для killall5 и не всегда определяется для всех систем –

+0

См. мой обновленный ответ. –

+0

От человека pidof: «pidof на самом деле такая же программа, как killall5; программа ведет себя в соответствии с именем, под которым оно вызывается. » pidof ведет себя иначе, чем killall 5. Если вы используете старую старую систему unix, ее может не быть. –

15

$ DISPLAY - это стандартный способ. Это то, как пользователи общаются с программами о том, какой X-сервер использовать, если они есть.

+0

, но что, если пользователь спрятал эту переменную? Что делать, если он пытается что-то сделать и изменяет эту переменную, а затем, когда я ее проверю, больше не отражает точное состояние системы. сделайте это? –

+2

Если я устанавливаю $ DISPLAY, это потому, что я хочу, чтобы ваша программа переходила на другой дисплей. Что именно ваш вариант использования, когда вы хотите угадать явную конфигурацию пользователя? Не избегайте использования $ HOME в случае, если пользователь тоже «скрипит»? Где это заканчивается? – Ken

+0

Я не хочу догадываться, просто пуленепробиваемый. Вариант использования предназначен для установщика драйверов, для одного из необходимых условий используется x. И я бы не избегал использования $ HOME, но плохо проверял, что он указывает на существующий каталог сначала на всякий случай ^^ –

6

Один трюк я использую, чтобы сказать, если X работает под управлением находится:

телнет 127.0.0.1 6000

Если соединение, у вас есть сервер X работает и его прием входящих соединений TCP (обычно не по умолчанию в эти дни) ....

+0

Я полагаю, что в настоящее время системы безопасности не будут иметь доступную команду telnet. – boardrider

3

1)

 
# netstat -lp|grep -i x 
tcp  0  0 *:x11     *:*      LISTEN  2937/X   
tcp6  0  0 [::]:x11    [::]:*     LISTEN  2937/X   
Active UNIX domain sockets (only servers) 
unix 2  [ ACC ]  STREAM  LISTENING  8940  2937/X    @/tmp/.X11-unix/X0 
unix 2  [ ACC ]  STREAM  LISTENING  8941  2937/X    /tmp/.X11-unix/X0 
# 

2) Nmap

 
# nmap localhost|grep -i x 
6000/tcp open X11 
# 
38

Мне часто нужно запустить команду X на сервере, на котором запущено много X-серверов, поэтому ответы на основе ps не работают. Естественно, $DISPLAY должен быть установлен соответствующим образом. Для того, чтобы проверить, что действительно, использовать xset q в какой-то фрагмент, как:

if ! xset q &>/dev/null; then 
    echo "No X server at \$DISPLAY [$DISPLAY]" >&2 
    exit 1 
fi 
+0

Я думаю, что это «лучше», чем использование 'xprop' и' xdpyinfo', поскольку 'xset' производит меньше вывода для'/dev/null', чтобы поесть. ОП должен принять этот ответ. – jamadagni

4

перспективе xdpyinfo и посмотреть, если он возвращает нулевое

2
xprop -root &> /dev/null 

...моя проверенная & истинная команда для проверки ситуации «Х-способна». И, в значительной степени гарантировано, что на любой системе, работающей на X, конечно, команда терпит неудачу, если ее не найти в любом случае, поэтому даже если она не существует, вы можете в значительной степени предположить, что также нет X. (вот почему я использую &> вместо>)

+0

Re '&>' для использования в сценариях оболочки, работающих под 'dash', который не поддерживает' &> ', можно использовать'>/dev/null 2> & 1'. – jamadagni

+0

На cygwin типичным способом установки X является установка пакета 'xinit'. Таким образом, 'xprop' не устанавливается автоматически, так как это не зависимость. –

0

Я написал xdpyprobe программу, предназначенную для этой цели. В отличие от xset, xdpyinfo и других общих инструментов, он не выполняет никаких дополнительных действий (просто проверяет X-сервер и выходы), и он может не производить никакого вывода (если указан параметр «-q»).

0

Это скрипт PHP для проверки.

$xsession = `pidof X`; 
if (!$xsession) { 
    echo "There is no active X session, aborting..\n"; 
    exit; 
} 

Аналогичная команда может использоваться и в сценарии оболочки. как команда pidof.

1

Прежде всего, необходимо обеспечить основополагающие пакеты X11 правильно установлены на вашем сервере:

rpm -qa | grep xorg-x11-xauth 

Если нет, то, пожалуйста, установить все пакеты:

sudo yum install xorg-x11-xauth xterm 

Убедитесь, что сервер OpenSSH настроен на пересылку x11:

edit file : vim /etc/ssh/sshd_config 

X11Forwarding yes 

ПРИМЕЧАНИЕ: Если эта линия равна p отменил комментарий (#) или был установлен на no, обновил файл в соответствии с вышеизложенным и перезапустил ваш демон ssh-сервера (будьте осторожны здесь - если вы сделали ошибку, вы можете заблокировать себя от сервера)

sudo /etc/init.d/sshd restart 

Теперь настроить приложение SSH для пересылки запросов X11:

ssh -Y [email protected]_server.your_domain.com 
Смежные вопросы