Por que o apache escreve seu próprio ID de processo em httpd.pid?

6

Eu sou novo no Apache e depuro problemas causados por ele. Eu entendi que quando o Apache é iniciado, ele escreve seu próprio ID de processo em httpd.pid em um formato legível como explicado Bekman / Practical-mod_perl / 5-3-3-Encontrando-a-direita-Apache-PID.html # .UQbuirb4wSg "> aqui .

Eu não entendo muito bem por que o ID do processo é necessário em primeiro lugar. Mesmo que seja necessário, não entendo o motivo dessa abordagem.

No Linux, um processo pode encontrar o id do processo do Apache usando ps -ef e etc. Em geral, eu não ouvi falar de nenhum outro processo escrevendo seu ID de processo em algum arquivo.

O que há de tão especial nesse processo do Apache?

    
por p2pnode 10.05.2012 / 14:14

4 respostas

9

Na maioria dos sistemas Unix, os serviços são iniciados e parados pelo sistema init . Muitas distribuições Linux usam o sysvinit legado, que quase não possui funções de gerenciamento de serviços, portanto, os scripts em /etc/init.d ou /etc/rc.d executam o trabalho real de iniciar ou eliminar o Apache. Esses initscripts são escritos em simples sh e não têm outro meio de rastrear os processos que eles iniciam - além de ler seu PID de um local pré-definido. (O script só pode saber PIDS de processos lançados diretamente, mas não de filhos de esses processos, nem processos lançados na última vez em que o mesmo script foi chamado. Isso significa que o script não pode rastrear processos que foram programado para "daemonizar" eles mesmos.)

(Sim, um processo pode ser encontrado usando ps -ef , ou examinando /proc diretamente. No entanto, este é um método pouco confiável - pode haver vários processos Apache sendo executados ao mesmo tempo: por exemplo, mpm- prefork, ou várias configurações independentes do Apache. Devido a isso, quase todos os daemon no Linux criarão um "pidfile" em /run ou /var/run , para que seja facilmente interrompido por um script Você provavelmente terá crond.pid , ntpd.pid , rsyslogd.pid , sshd.pid e assim por diante.)

Apenas sistemas de inicialização Linux muito recentes incomodam os processos de rastreamento: Upstart no Ubuntu precisa saber exatamente quantos garfos esperar, enquanto systemd no Fedora usa o kernel cgroups para rastrear processos pertencentes a um serviço.

    
por 10.05.2012 / 14:38
2

A razão é que terceiros podem usar sinais , por meio de kill(1) , para controlar a instância do Apache em execução. Por exemplo, para direcioná-lo para recarregar a configuração.

As outras respostas ainda se aplicam.

Tenha também em mente que você pode executar várias instâncias do Apache em várias portas e com várias configurações na mesma máquina. Fica ainda mais interessante quando você usa o modo de bifurcação (padrão, IIRC). Você precisa ser capaz de descobrir a instância controladora do Apache para uma horda de processos filhos, então essa é a maneira mais pragmática de fazê-lo.

    
por 10.05.2012 / 14:53
1

O Apache quer saber se outra instância do Apache já está em execução. Escrever o número do processo é mais confiável do que usar ps e permite testar se um desligamento do processo é inesperado (sem excluir o arquivo .pid ). Também não há garantia de que ps estará disponível em qualquer sistema em particular (devido a permissões, por exemplo).

Vários outros programas também usam arquivos .pid . Verifique seu diretório /var/run . O meu tem vários.

    
por 10.05.2012 / 14:38
1

Como as outras respostas disseram, você deseja ter o ID do processo para enviar sinais para ele. Como é um processo daemon, os sinais são um dos principais métodos para se comunicar. Você pode terminar o apache, dizer para recarregar a configuração, etc., com sinais.

É mais importante com o apache e com o modelo de processo, porque (normalmente) o apache tem uma relação pai / filho, com o pai sendo um controlador que bifurca / colhe filhos. Se você quiser derrubar o servidor, você precisa enviar um sinal para o pai, não para os filhos. Se você acabou de ps , você teria que percorrer esse relacionamento pai / filho para encontrar o pai; só então você poderia enviar um sinal.

    
por 29.01.2013 / 00:31