Qualquer solução que use algo como ps aux | grep abc
ou pgrep abc
tem falhas.
Por quê?
Como você não está verificando se um processo específico está em execução, está verificando se há algum processo em execução que corresponda a abc
. Qualquer usuário pode facilmente criar e executar um executável chamado abc
(ou que contém abc
em algum lugar em seu nome ou argumentos), causando um falso positivo em seu teste. Existem várias opções que você pode aplicar a ps
, grep
e pgrep
para restringir a pesquisa, mas você ainda não obterá um teste confiável.
Então, como testar de forma confiável um determinado processo em execução?
Isso depende do que você precisa para o teste.
Eu quero garantir que o serviço abc esteja em execução e, caso contrário, inicie-o
É para isso que o init e o newstart servem. Eles iniciarão o serviço e garantirão que seu pid seja armazenado em um pidfile. Tente iniciar o serviço novamente (via init ou upstart) e ele verificará o pidfile, e o iniciará se não estiver lá, ou abortará se já estiver em execução. Isso ainda não é 100% confiável, mas é o mais próximo possível.
Veja Como posso verificar se o meu servidor de jogo é ainda em execução ... para outras soluções.
abc é o meu script. Preciso ter certeza de que apenas uma instância do meu script está sendo executada.
Nesse caso, use um arquivo de bloqueio ou um lockdir. Por exemplo,
#!/usr/bin/env bash
if ! mkdir /tmp/abc.lock; then
printf "Failed to acquire lock.\n" >&2
exit 1
fi
trap 'rm -rf /tmp/abc.lock' EXIT # remove the lockdir on exit
# rest of script ...
Consulte FAQ 45 da Bash para conhecer outras formas de bloqueio.