Os arquivos .pid são confiáveis ​​para determinar se um processo está em execução?

11

Muitos programas, como o sshd, criam arquivos .pid em / var / run / que contêm o ID do processo. Esses arquivos são confiáveis ​​para determinar se um processo está em execução? Meu palpite é que esses arquivos são criados manualmente por um processo e, portanto, ainda permanecerão no sistema de arquivos se o programa travar.

indiv
fonte

Respostas:

16

em termos simples, não : um processo (por exemplo, um daemon) pode falhar e não ter tempo para limpar seu arquivo .pid.

Uma técnica para ter mais certeza do estado de um programa: use um canal de comunicação explícito, como um soquete. Escreva a porta do soquete em um arquivo e faça com que o supervisorprocesso a procure.

Você também pode usar os serviços do DBus no Linux: registre um nome específico e faça com que seu processo de supervisor (como você o chama) verifique esse nome.

Existem inúmeras técnicas.

Uma coisa a lembrar: não é responsabilidade do sistema operacional gerenciar os arquivos PID.

jldupont
fonte
1
A existência do arquivo pid, COMBINADA com a existência do processo, no entanto, deve ser suficiente. Se o processo for encerrado, você pode verificar isso. Os PIDs são reutilizados, mas não com muita frequência.
MarkR
2
A frequência com que um pid é reutilizado depende do sistema em questão. Eu vi um sistema em que os PIDs circulavam pelo menos diariamente. Você precisa verificar o pid, se existe um processo e que o processo parece ser o que você espera possuir o pid.
@ atk: exatamente. Não existe um padrão em si e, mesmo que exista, ele pode muito bem não ser respeitado por algumas implementações. Por exemplo, eu posso criar um daemon que não grave um arquivo PID e usar um canal de retorno para obter seus comandos de gerenciamento.
Jdupont
@atk: infelizmente, não há nenhuma maneira de garantir que o PID não são reutilizados entre o tempo de verificação e tempo de uso ...
Samb
3

A Jldupont está correta ao afirmar que os arquivos .pid não são confiáveis para determinar se um processo está em execução, pois o arquivo não pode ser removido no caso de uma falha.

Além das condições de corrida, geralmente uso o pgrep quando preciso saber se um processo está em execução. Eu poderia então fazer referência cruzada da saída com o (s) arquivo (s) .pid se considerasse necessário.

jschmier
fonte
3

Um arquivo contendo uma identificação de processo não é confiável para determinar se um processo está sendo executado ou não. É apenas uma fonte confiável, para descobrir o último ID de processo fornecido para o processo.

Quando você tem o ID do processo, é necessário fazer uma verificação adicional, se o processo estiver realmente em execução.

Aqui está um exemplo:

#!/usr/bin/env sh

file="/var/run/sshd.pid"
processid=$(cat /var/run/sshd.pid)

if [ ! -f ${file} ]; then
    echo "File does not exists: ${file}"
    exit 1
fi

if [ ! -r ${file} ]; then
    echo "Insufficient file persmissons: ${file}"
    exit 1
fi

psoutput=$(ps -p ${processid} -o comm=)

if [ $? == 0 ];then
    if [ ${psoutput} == "sshd" ]; then
        echo "sshd process is realy running with process id ${processid}"
        exit 0
    else
        echo "given process id ${processid} is not sshd: ${psoutput}"
        exit 1
    fi
else
    echo "there is no process runing with process id ${processid}"
    exit 0
fi

O pgrep é um bom comando, mas você terá problemas quando tiver várias instâncias em execução. Por exemplo, quando você tem um sshd regular em execução na porta TCP / 22 e outro sshd em execução na porta TCP / 2222, o pgrep fornecerá dois IDs de processo ao procurar por sshd ... quando o sshd normal tiver seu pid em / var /run/sshd.pid e o outro pode ter seu pid em /var/run/sshd-other.pid, você pode diferenciar claramente os processos.

Eu não recomendo usar apenas ps , canalizar através de um ou vários pipes com grep e grep -v tentando filtrar todas as outras coisas que não lhe interessam ... é um pouco como usar

find . | grep myfile

para descobrir, se um arquivo sair.

Mirko Steiner
fonte
2

Não é confiável simplesmente verificar a existência de um processo com o mesmo pid contido no arquivo.

Mas muitas implementações de pidfile também bloqueiam o pidfile, de modo que, se o processo morrer, o bloqueio desaparecerá. Desde que o mecanismo de bloqueio seja confiável, verificar se o arquivo ainda está bloqueado é um mecanismo relativamente confiável para determinar se o processo original ainda está em execução.

Paul Brannan
fonte
1

Jldupont está correto.

No entanto, você pode enviar ao processo um sinal 0 (kill -s 0 pid) para ver se o processo ainda está ativo (supondo que você tenha autoridade para enviar esse sinal - em geral, apenas o proprietário de um processo pode enviar é um sinal).


fonte
4
Mas verificar a existência de um processo com esse PID não significa que é o PID que lhe interessa.
janm 23/02/10
0

Eu concordo com jschmier.

Em alguns sistemas, você não tem acesso ao pgrep. Nesse caso, você pode fazer ps -aef | grep <pid>para descobrir se o processo está realmente em execução.

user29584
fonte
1
O ponto chave na questão era "confiável". Fazer um ps e procurar um PID não é confiável.
JANM
bem ... supondo que você saiba esse nome do programa, por que você acha ps-aef | grep não é confiável?
user29584
3
Condições da corrida: o estado do sistema mudou quando o ps terminou. Títulos do processo: outro processo pode ter um título semelhante ao de seu interesse. Várias instâncias: considere um sistema com duas instâncias do mesmo serviço, cada uma com um arquivo PID. Um falha e o outro reinicia e obtém o PID do primeiro serviço. Como você diz? Etc. Não confiável, impossível de acertar por causa das condições da corrida, e existem técnicas confiáveis ​​que simplesmente funcionam. Para uma alternativa confiável, consulte, por exemplo, cr.yp.to/daemontools.html
janm