Как узнать, работает ли httpd или нет через командную строку?

29

Я работаю над небольшой панелью управления для моего сервера. Мне нужна команда, которая скажет, httpdзапущен или остановлен.

Вероятно, будет использовать тот же код для других служб.

user70804
источник

Ответы:

28

Большинство людей запускают свои httpd (Apache, Nginx и т. Д.) Через систему инициализации. Это почти наверняка имеет место, если вы установили из пакета. Почти во всех этих системах инициализации есть метод, работающий, если он работает. В моем случае я использую nginx, который поставляется с скриптом инициализации в стиле SysV и принимает statusаргумент, например:

$ /etc/init.d/nginx status
 * nginx is running

Очевидно, что если вы используете другую систему httpd, script или init, у вас будет немного другой синтаксис, но если вы не запускаете httpd самостоятельно (что кажется худшей идеей в мире), вы вероятно, используя хороший, управляемый скрипт запуска, который позволит вам запрашивать статус.

В ответе slm есть больше о такого рода запросах инициализации, но проблема с доверием заключается в том, что он только говорит вам, если процесс все еще выполняется. Основной процесс вашего httpd может быть запущен, но в некотором роде заблокирован. Имеет смысл пропустить простые тесты инициализации и перейти к поведенческим тестам.

Мы знаем о httpds одну вещь - они слушают. Обычно через порт *:80, но если у вас нет, вы можете адаптировать код, следуя коду. Здесь я просто awkвыводю, netstatчтобы посмотреть, слушает ли он правильный порт.

$ sudo netstat -ntlp | awk '$4=="0.0.0.0:80"'
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      2079/nginx

Мы также можем проверить, какой процесс запущен, чтобы убедиться, что работает правильный httpd. Мы могли бы сделать все виды проверок. Зависит от того, каким параноиком ты хочешь быть :)

Но даже это только отражение httpd. Хотите действительно проверить это? Хорошо, давайте проверим это.

$ wget --spider -S "http://localhost" 2>&1 | awk '/HTTP\// {print $2}'
200

Я просто смотрю на код ответа (200 означает «Хорошо!»), Но опять же, мы могли бы покопаться и на самом деле проверить вывод, чтобы убедиться, что он генерируется правильно.

Но даже это не так тщательно. Вы проверяете, localhostи он сообщает 200, ничего плохого? Что делать, если бобры жуют через сетевой кабель, который обеспечивает httpd (но не остальную часть системы)? И что?! Вы сообщаете о работоспособности, когда на самом деле не работаете. Немногие вещи выглядят более непрофессионально, чем неверные данные о статусе.

Итак, давайте поговорим с внешним сервером (в идеале на совершенно другом соединении, в другой галактике далеко-далеко) и попросим его запросить наш сервер:

$ ssh tank 'wget --spider -S "http://bert" 2>&1' | awk '/HTTP\// {print $2}'
200

К этому моменту любые проблемы, о которых сообщалось, являются либо проблемами в приложении (которые могут иметь свои собственные обработки ошибок и отчеты, либо они находятся на стороне клиента).

Комбинация этих тестов может помочь решить проблему.

Oli
источник
3
что случилось с httpd?
Крик
@ Крик Что ты имеешь в виду?
Оли
4
+1 за хороший ответ, но ОП спросил о httpd, и вы использовали nginx
Creek
4
@ Creek В моих книгах httpd означает «демон http; веб-сервер». Не конкретный. Как вы думаете, я должен делать по-другому? Я не знаю, как я мог бы проверить это более тщательно, не покупая сначала напиток.
Оли
3
Если бы я мог купить тебе выпивку за слова, классика. Я думаю, что OP означало httpd для
Creek
25

Вы можете использовать команду services универсально в большинстве дистрибутивов Linux.

$ service <service> status

пример

$ service httpd status
httpd (pid  23569) is running...

Эту же команду можно использовать для всех служб, работающих на индивидуальной основе, или для поиска статуса всех служб.

$ service --status-all
python is stopped
automount (pid 22457) is running...
Avahi daemon is not running
Avahi DNS daemon is not running
crond (pid  23577) is running...
gpm is stopped
hald is stopped
httpd (pid  23569) is running...
...

Различные методы в SysVinit, Systemd и Upstart для перечисления сервисов

Если вы используете одну из более типичных структур управления службами, вы можете использовать следующие методы для перечисления служб внутри каждой из них.

SysVinit

$  ls -l /etc/init.d/ | head -10
total 220
-rwxr-xr-x 1 root root  1422 Jan 13  2009 ajaxterm
-rwxr-xr-x 1 root root  3052 Apr 20  2012 autofs
-rwxr-xr-x 1 root root  1877 Apr 13  2011 avahi-daemon
-rwxr-xr-x 1 root root  1824 Apr 13  2011 avahi-dnsconfd
-rwxr-xr-x 1 root root  1926 Feb 22  2012 crond
-rwxr-xr-x 1 root root 14291 Dec 19  2011 functions
-rwxr-xr-x 1 root root  1778 Jan  6  2007 gpm
-rwxr-xr-x 1 root root  1586 Mar  5  2011 haldaemon
-rwxr-xr-x 1 root root  5742 Dec 19  2011 halt

Systemd

$ systemctl list-unit-files --type=service | head -10
UNIT FILE                                   STATE   
abrt-ccpp.service                           enabled 
abrt-oops.service                           enabled 
abrt-pstoreoops.service                     disabled
abrt-vmcore.service                         enabled 
abrt-xorg.service                           enabled 
abrtd.service                               enabled 
accounts-daemon.service                     enabled 
alsa-restore.service                        static  
alsa-state.service                          static  

Выскочка

$ initctl list | head -10
avahi-daemon start/running, process 1090
mountall-net stop/waiting
nmbd start/running, process 2045
passwd stop/waiting
rc stop/waiting
rsyslog start/running, process 1088
tty4 start/running, process 1211
udev start/running, process 483
upstart-udev-bridge start/running, process 480
ureadahead-other stop/waiting

Ссылки

SLM
источник
Это правильный ответ, насколько я знаю. Но ОП принял другой :)
Рамеш
@Ramesh - все в порядке, Oli's A тоже правильно, просто немного более эзотерично.
slm