Estou escrevendo um script Perl que analisa arquivos de log para coletar PIDs e verifica se esse PID está em execução. Estou tentando pensar na melhor maneira de fazer essa verificação. Obviamente, eu poderia fazer algo como:
system("ps $pid > /dev/null") && print "Not running\n";
No entanto, eu preferiria evitar a chamada do sistema, se possível. Por isso, pensei que poderia usar o /proc
sistema de arquivos (portabilidade não é uma preocupação, isso sempre estará sendo executado em um sistema Linux). Por exemplo:
if(! -d "/proc/$pid"){
print "Not running\n";
}
Isso é seguro? Posso sempre assumir que, se não houver /proc/$pid/
diretório, o PID associado não está sendo executado? Espero que sim, já que o ps
próprio AFAIK obtém suas informações de /proc
qualquer maneira, mas como isso é para código de produção, quero ter certeza.
Portanto, pode haver casos em que um processo em execução não possui /proc/PID
diretório ou onde /proc/PID
existe um diretório e o processo não está em execução? Existe algum motivo para preferir a análise em ps
vez de verificar a existência do diretório?
kill -0
é o melhor), isso apenas informa se existe um processo em execução com o PID especificado . Ele não informa se o processo ainda estará em execução um milissegundo mais tarde e não informa se o processo é o que você está interessado ou se um processo não relacionado foi atribuído ao mesmo PID após a morte do processo interessante . Quase sempre é um erro testar se um determinado PID está sendo executado : há muito poucas circunstâncias em que isso não é propenso a condições de corrida.
kill
função perl usando o sinal 0, que não mata, mas diz se você pode fazê-lo (ou seja, você precisa de permissão para sinalizar esse processo).