No Linux é muito comum um daemon, durante sua execução, criar um arquivo .pid dentro de /var/run. Dentro do arquivo syslogd.pid, por exemplo, contém o PID da instância do syslogd em execução. Usa-se este mecanismo para impedir que duas instâncias do mesmo processo rodem simultaneamente e conflitem na obtenção de recursos.
Porém, a simples existência do arquivo .pid não garante que o processo esteja em execução. Ele pode ter sido fechado de uma forma inesperada e não o apagou. Então, temos que ler o conteúdo do arquivo .pid e certificar que o processo com aquele número de PID está em execução.
A forma mais fácil de fazer isso é enviando o sinal 0 para o processo. O sinal 0 é especial e não é de fato enviado, caso contrário o processo destinatário poderia ser fechado se não tratasse o sinal, mas o retorno da função indica se um sinal real seria enviado com sucesso. O código a seguir exemplifica como aplicar a técnica em C:
int main(int argc, char **argv) { unsigned int pid; if (argc != 2) { printf("Uso: %s PID\n", argv[0]); return 1; } pid = (unsigned int) atoi(argv[1]); if (!kill(pid, 0)) printf("%d esta em execucao.\n", pid); else printf("%d nao esta em execucao.\n", pid); return 0; }
A mesma técnica pode ser aplicada no terminal:
$ kill -0 123 $ echo $? # Imprime 0 se o PID 123 existir, 1 caso contrario
Note que você precisa ter permissão para enviar um sinal para um determinado processo. Para um usuário sem privilégios especiais, a dica só vai funcionar para verificar a existência de processos iniciados pelo próprio usuário.
Legal,
Pode ainda fazer passando o nome do processo e usar como base utilizando algo como base neste meu exemplo > http://blog.jorgepereira.com.br/2009/01/13/checando-processos-com-a-libproc/
[]s
Nossa, muito simples!!!
Essa do signal 0 é nova pra mim.
Valeu!
Use a libproc como sugeriu o Jorge Pereira acima ou então tente extrair de:
/proc/[PID do processo]/status