Como selecionar um valor PID específico se mais de um processo possui um número PID semelhante?

Como selecionar um valor PID específico se mais de um processo possui um número PID semelhante?

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 em proclist. […]

(fonte)

No seu caso:

ps -p 445

POSIX diz psque deve retornar status de saída positivo se "ocorreu um erro". Todo que pstestei considera proclistque 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:

Responder2

Você pode verificar se um processo está sendo executado em scripts Bash usando kill -0assim:

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.

informação relacionada