Os arquivos .pid são confiáveis para determinar se um processo está sendo executado?

9

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

    
por indiv 22.02.2010 / 22:17

6 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 processo supervisor procure por ele.

Você também pode usar os serviços do DBus no Linux: registre um nome específico e tenha seu processo de supervisor (seja qual for o nome dele) verifique esse nome.

Existem inúmeras técnicas.

Uma coisa a ser lembrada: não é responsabilidade do SO gerenciar os arquivos PID.

    
por 22.02.2010 / 22:17
3

O Jldupont está correto em afirmar que os arquivos .pid não são confiáveis para determinar se um processo está sendo executado, já que o arquivo não pode ser removido no caso de uma falha.

Condições de raça à parte, muitas vezes uso pgrep quando preciso saber se um processo está correndo. Eu poderia então cruzar a saída contra o (s) arquivo (s) .pid se eu achar necessário.

    
por 22.02.2010 / 23:30
3

Um arquivo que contém um id 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 dado para o processo.

Quando você tem o id do processo, você precisa fazer uma verificação mais detalhada, 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 rodando na porta TCP / 22 e você tem outro sshd rodando na porta TCP / 2222, então o pgrep irá entregar dois ids de processo quando procurar por sshd ... quando o normal O sshd tem 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 , canalizando um ou vários canais 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 sai.

    
por 16.05.2018 / 11:34
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 desaparece. Contanto 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.

    
por 30.05.2015 / 04:37
1

O Jldupont está correto.

Você pode, no entanto, 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 tal sinal - em geral, apenas o proprietário de um sinal processo pode enviar um sinal).

    
por 22.02.2010 / 22:40
0

Concordo com o jschmier.

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

    
por 23.02.2010 / 01:35