Pracuję nad małym panelem sterowania dla mojego serwera. Potrzebuję polecenia, które powie, czy httpd
jest uruchomione, czy zatrzymane.
Prawdopodobnie użyje tego samego kodu również do innych usług.
Pracuję nad małym panelem sterowania dla mojego serwera. Potrzebuję polecenia, które powie, czy httpd
jest uruchomione, czy zatrzymane.
Prawdopodobnie użyje tego samego kodu również do innych usług.
Odpowiedzi:
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 status
argument, 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 awk
dane wyjściowe netstat
nasł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 localhost
i 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.
Możesz używać polecenia services uniwersalnie w większości dystrybucji Linuksa.
$ service <service> status
$ 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...
...
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