Jak sprawdzić, czy httpd działa, czy nie za pomocą wiersza poleceń?


29

Pracuję nad małym panelem sterowania dla mojego serwera. Potrzebuję polecenia, które powie, czy httpdjest uruchomione, czy zatrzymane.

Prawdopodobnie użyje tego samego kodu również do innych usług.

Odpowiedzi:


28

Większość osób korzysta z httpd (Apache, Nginx itp.) Za pośrednictwem systemu init. Tak jest prawie na pewno w przypadku instalacji z pakietu. Prawie wszystkie z tych systemów inicjujących mają metodę sprawdzającą się, jeśli jest uruchomiona. W moim przypadku używam nginx, który dostarcza skrypt inicjujący w stylu SysV i który przyjmuje statusargument, tak jak poniżej:

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

Oczywiście, jeśli używasz innego systemu httpd, skryptu lub systemu init, będziesz miał nieco inną składnię, ale chyba że samodzielnie uruchomisz httpd (co wydaje się najgorszym pomysłem na świecie), prawdopodobnie używając ładnego, zarządzanego skryptu startowego, który pozwoli ci zapytać o status.

Odpowiedź slm zawiera więcej informacji na temat tego rodzaju zapytań inicjujących, ale problem polegający na zaufaniu polega na tym, że naprawdę mówi tylko, czy proces nadal działa. Główny proces twojego httpd może być uruchomiony, ale w jakiś sposób zablokowany. Sensowne jest pominięcie prostych testów inicjacyjnych i przejście do testów behawioralnych.

Jedno wiemy o httpds, że słuchają. Zwykle na porcie *:80, ale jeśli nie, możesz dostosować kod za kodem. Właśnie sprawdzam, czy awkdane wyjściowe netstatnasłuchują na odpowiednim porcie.

$ 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

Możemy również sprawdzić, który proces jest uruchomiony, aby upewnić się, że działa właściwy httpd. Moglibyśmy przeprowadzać różnego rodzaju kontrole. Zależy, jak paranoik chcesz być :)

Ale nawet to jest tylko odzwierciedleniem httpd. Chcesz to naprawdę przetestować? Dobrze niech przetestować go.

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

Patrzę tylko na kod odpowiedzi (200 oznacza „A-OK!”), Ale znowu możemy się zalogować i przetestować dane wyjściowe, aby upewnić się, że są poprawnie generowane.

Ale nawet to nie jest takie dokładne. Sprawdzasz localhosti zgłasza 200, nic złego? Co się stanie, jeśli bobry przeżują kabel sieciowy zasilający httpd (ale nie resztę systemu)? Więc co ?! Zgłaszasz dyspozycyjność, kiedy faktycznie nie żyjesz. Niewiele rzeczy wygląda bardziej nieprofesjonalnie niż nieprawidłowe dane o stanie.

Porozmawiajmy więc z zewnętrznym serwerem (najlepiej przy zupełnie innym połączeniu, w innej galaktyce daleko, daleko) i poproś go o wysłanie zapytania do naszego serwera:

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

W tym momencie wszelkie zgłoszone problemy są albo problemami w aplikacji (które mogą mieć własne metody obsługi błędów i raportowania, albo są po stronie klienta).

Kombinacja tych testów może pomóc ustalić, gdzie jest problem.


3
co się stało z httpd?
Creek

@Creek Co masz na myśli?
Oli

4
+1 za dobrą odpowiedź, ale OP zapytał o httpd i użyłeś nginx
Creek

4
@Creek W moich książkach „httpd” oznacza „demon http; serwer WWW”. Nieokreślony. Jak myślisz, co powinienem robić inaczej? Nie wiem, jak mógłbym je jeszcze bardziej dokładnie sprawdzić bez potrzeby kupowania napoju.
Oli

3
Gdybym mógł kupić ci drinka za powiedzenie, że tak, klasycznie. Myślę, że OP oznaczało httpd
Creek

25

Możesz używać polecenia services uniwersalnie w większości dystrybucji Linuksa.

$ service <service> status

Przykład

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

Tego samego polecenia można użyć dla wszystkich usług, które są uruchomione indywidualnie lub w celu znalezienia statusu wszystkich usług.

$ 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...
...

Różne metody SysVinit, Systemd i Upstart dla usług listowania

Jeśli korzystasz z jednej z bardziej typowych ram zarządzania usługami, możesz użyć następujących metod, aby wyświetlić listę usług w ramach każdej z nich.

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  

Dorobkiewicz

$ 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

Referencje


O ile wiem, to poprawna odpowiedź. Ale OP zaakceptował drugą :)
Ramesh

@Ramesh - w porządku, Oli A również jest poprawne, jest tylko trochę bardziej ezoteryczne.
slm
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.