Escreva um arquivo PID manualmente a partir do script Bash

10

Como eu poderia escrever um script Bash que executa um programa de longa duração e armazena a identificação do processo do programa em um arquivo separado?

Eu quero algo como

#!/bin/bash
exec long_running_tool
echo `ps af |grep "long_running_tool" |awk '$5 == "long_running_tool" {print $1}'` > pid_file

No entanto, fazer exatamente isso executaria a ferramentaps após a conclusão.

Existe uma maneira de obter o ID do processo criado?

DerMike
fonte
2
Seu código de exemplo não funcionará porque o exec não bifurca, portanto, o processo do shell é substituído pelo long_running_toolprocesso. Conseqüentemente, o executivo nunca retorna e a seguinte linha nunca é alcançada. Veja help exec, execve(2).
precisa saber é o seguinte
@ e-t172 obrigado por apontar. Eu apago 'exec' então.
precisa saber é o seguinte
2
Por favor, consulte Gerenciamento de Processo .
Pausado até novo aviso.

Respostas:

12

Você pode facilmente executar o processo em segundo plano com "&" e obter o PID do processo em segundo plano usando "$!"

#!/bin/bash
long_running_tool &
echo $! > pid_file

Então, opcionalmente, aguarde $! se você deseja que o shell bloqueie até que o processo conclua a execução.

Jeremy Sturdivant
fonte
11
UPDATE: quando uso o fg, recebo 'fg: 21: job (null) não criado sob controle de job' e o script não é bloqueado. Desculpa.
precisa saber é o seguinte
"espera $!" deve ter um efeito semelhante ao fg que eu posso confirmar que, de fato, funciona em um script. Eu provavelmente deveria ter verificado isso antes de postar. >.> meu mal.
Jeremy Sturdivant
9
#!/bin/bash
echo $$ > fooapp.pid
exec fooapp

Como mencionado anteriormente, exec substitui bash pelo programa especificado, mantendo o PID.

user1686
fonte