
Estou usando o RHEL 7.5 e tenho um programa Java que inclui um arquivo com o número PID. Se o processo for encerrado, o arquivo ainda existe e estou fazendo um script para validar se o PID que está armazenado naquele arquivo está ativo ou não, mas tenho uma dúvida ou problema.
O PID 445 existe e o 2445 existe. Então, como posso obter apenas o 445?
Tentei com o seguinte comando:
ps -ax | egrep "^ 445"
Mas não retornou nada.
Os dois processos:
ps -ax | grep -v grep | egrep "445"
445 pts/2 Sl 3:50 /opt/
2445 ? S 0:00 dbus-launch
Responder1
Usar -p
:
-p proclist
Escreva informações para processos cujos números de ID de processo são fornecidos emproclist
. […]
(fonte)
No seu caso:
ps -p 445
POSIX diz ps
que deve retornar status de saída positivo se "ocorreu um erro". Todo que ps
testei considera proclist
que não contém pelo menos um PID de umexistirprocesso como "errôneo". Isso é útil. Exemplo:
ps -p 445 >/dev/null && echo "Process exists."
Notas:
- PIDs de processos encerrados podem/serão reutilizados eventualmente, portanto, mesmo que o PID esteja em uso, pode não ser o processo no qual você está interessado.
- Se o PID no arquivo vier de antes da (re) inicialização recente, o processo obviamente não existirá mais, mesmo que o PID esteja em uso agora. (Dica:configure o programa para que o arquivo esteja ativado
tmpfs
).
Responder2
Você pode verificar se um processo está sendo executado em scripts Bash usando kill -0
assim:
if [ -f ${pid_file} ] && kill -0 $(cat ${pid_file}) 2>/dev/null; then
exit
else
rm -rf ${pid_file}
exit
fi
Isso ${pid_file}
equivale ao caminho do arquivo com o PID nele. O -f ${pid_file}
verifica se o arquivo PID existe. Em seguida, kill -0 $(cat ${pid_file})
verifica se o processo está em execução.
O que se resume a:
- Se o processo estiver em execução, não faça nada além de sair do script.
- Caso contrário (se o processo fornãoem execução, basta remover o arquivo PID.
A magia do kill -0
é explicada na página de manual dokill
:
Seassinarfor 0, então nenhum sinal será enviado, mas a verificação de erros ainda será executada; isso pode ser usado para verificar a existência de um ID de processo ou ID de grupo de processos.