Como descobrir se o httpd está sendo executado ou não via linha de comando?

27

Estou trabalhando em um pequeno painel de controle para o meu servidor. Preciso de um comando que diga se httpd está em execução ou parado.

Provavelmente também usará o mesmo código para outros serviços.

    
por user70804 07.06.2014 / 17:29

2 respostas

29

A maioria das pessoas executa seu httpd (Apache, Nginx, etc) através de um sistema init. Isso é quase certamente o caso se você tiver instalado a partir de um pacote. Quase todos esses sistemas de inicialização têm um método funcionando se estiverem em execução. No meu caso, estou usando o nginx, que envia um script de inicialização no estilo SysV e aceita um argumento status , assim:

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

Obviamente, se você estiver executando um httpd, script ou sistema init diferente, você terá uma sintaxe ligeiramente diferente, mas a menos que esteja iniciando manualmente o httpd você mesmo (o que parece ser a pior idéia do mundo), provavelmente você está usando um script de inicialização agradável e gerenciado que permitirá consultar o status.

a resposta do slm tem mais sobre esse tipo de consulta do init, mas o problema de confiar nisso é que isso realmente diz você se um processo ainda estiver em execução. O processo principal do seu httpd poderia estar rodando, mas de algum modo travado. Faz muito sentido pular simples testes de inicialização e passar para testes comportamentais.

Uma coisa que sabemos sobre o httpds é que eles ouvem. Geralmente na porta *:80 , mas se a sua não, você pode adaptar o código a seguir. Aqui estou apenas awk ing a saída de netstat para ver se está escutando na porta certa.

$ 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

Também podemos verificar o qual processo está sendo executado para garantir que o direito httpd esteja em execução. Nós poderíamos fazer todo tipo de checagem. Depende o quão paranoico você quer ser:)

Mas mesmo isso é apenas um reflexo de um httpd. Quer realmente testar isso? Bem, vamos testar .

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

Estou apenas olhando para o código de resposta (200 significa "A-Okay!"), mas, novamente, podemos investigar e testar a saída para garantir que ela esteja sendo gerada corretamente.

Mas mesmo isso não é tão completo. Você está verificando localhost e está relatando 200, nada está errado? E se os castores mastigassem o cabo de rede que abastece o httpd (mas não o resto do sistema)? Então o que?! Você está reportando tempo de atividade quando está realmente baixo. Poucas coisas parecem mais não profissionais do que dados de status incorretos.

Então vamos falar com um servidor externo (idealmente em uma conexão completamente diferente, em outra galáxia longe, longe) e pedir para consultar nosso servidor:

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

A essa altura, quaisquer problemas relatados são problemas no aplicativo (que podem ter seu próprio tratamento de erros e / ou denúncia, ou estão no final do cliente).

Uma combinação desses testes pode ajudar a determinar onde o problema está.

    
por 07.06.2014 / 17:45
24

Você pode usar o comando services universalmente na maioria das distribuições Linux.

$ service <service> status

Exemplo

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

Este mesmo comando pode ser usado para todos os serviços que estão sendo executados individualmente ou para encontrar o status de todos os serviços.

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

Os vários métodos dentro do SysVinit, Systemd e Upstart para listar serviços

Se você estiver usando uma das estruturas de gerenciamento de serviços mais comuns, poderá usar os métodos a seguir para listar os serviços em cada um deles.

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  

Upstart

$ 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

Referências

por 07.06.2014 / 18:30