Як дізнатися, працює чи ні httpd через командний рядок?


29

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

Можливо, буде використовуватися той самий код і для інших служб.

Відповіді:


28

Більшість людей запускають httpd (Apache, Nginx тощо) через систему init. Це майже напевно випадок, якщо ви встановили з пакета. Практично всі ці системи init мають розроблений метод, якщо він працює. У моєму випадку я використовую nginx, який доставляє сценарій init у стилі SysV, який приймає statusаргумент, наприклад:

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

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

У відповіді slm детальніше про подібний запит на init, але проблема з довірою полягає в тому, що він справді говорить лише про те, що процес все ще працює. Основний процес вашого 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

До цього моменту будь-які проблеми, про які повідомлялося, є або проблемами в додатку (які можуть мати власні помилки - обробка та -звітування, або вони знаходяться в кінці клієнта).

Поєднання цих тестів може допомогти вирішити проблему там, де це теж питання.


3
що сталося з httpd?
Крік

@Creek Що ти маєш на увазі?
Олі

4
+1 за хорошу відповідь, але ОП запитав про httpd, а ви використовували nginx
Creek

4
@Creek У моїх книгах "httpd" означає "http daemon; веб-сервер". Не конкретний. Як ви думаєте, що я повинен робити інакше? Я не знаю, як я міг би більш ретельно перевірити один, не спочатку купуючи йому напій.
Олі

3
Якби я міг купити тобі напій, сказавши, що буду, класика. Я думаю, що ОП мав на увазі httpd
Creek

25

Ви можете використовувати команду послуг універсально для більшості дистрибутивів 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

Системний

$ 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

Список літератури


Наскільки я знаю, це правильна відповідь. Але ОП прийняла інше :)
Рамеш

@Ramesh - це все в порядку, А Олі теж правильний, це просто трохи езотеричніше.
slm
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.