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

29

Estou trabalhando em um pequeno painel de controle para o meu servidor. Eu preciso de um comando que diga se httpdestá sendo executado ou parado.

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

user70804
fonte

Respostas:

28

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

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

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

A resposta do slm tem mais informações sobre esse tipo de consulta init, mas o problema de confiar nisso é que realmente apenas informa se um processo ainda está em execução. O processo principal do seu httpd pode estar em execução, mas de alguma forma está travado. Faz muito sentido pular testes de inicialização simples e passar para testes comportamentais.

Uma coisa que sabemos sobre os 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 awkexibindo a saída netstatpara ver se está ouvindo na porta correta.

$ 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 qual processo está sendo executado também para garantir que o httpd correto esteja sendo executado. Poderíamos fazer todo tipo de verificação. Depende do quão paranóico você quer ser :)

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

$ 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, poderíamos cavar e realmente testar a saída para garantir que ela esteja sendo gerada corretamente.

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

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

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

A essa altura, todos os problemas relatados são problemas no aplicativo (que podem ter seu próprio tratamento de erros e relatórios, ou estão no final do cliente).

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

Oli
fonte
3
o que aconteceu com o httpd?
Creek
@ Creek O que você quer dizer?
Oli
4
+1 para uma boa resposta, mas OP perguntado sobre httpd e você usou nginx
Creek
4
@ Creek Nos meus livros, "httpd" significa "http daemon; um servidor web". Não é específico. O que você acha que eu deveria estar fazendo diferente? Eu não sei como eu poderia checar um mais completamente sem precisar comprar uma bebida primeiro.
Oli
3
Se eu pudesse lhe pagar uma bebida por dizer que faria, clássico. Acho OP significava apache é httpd
Creek
25

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 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 no SysVinit, Systemd e Upstart para listar serviços

Se você estiver usando uma das estruturas de gerenciamento de serviços mais típicas, poderá usar os seguintes métodos para listar os serviços em cada uma.

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

slm
fonte
Esta é a resposta correta, tanto quanto eu sei. Mas o OP tinha aceitado o outro :)
Ramesh
@ Jamesh - está tudo bem, o A de Oli também está correto, é apenas um pouco mais esotérico.
slm