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?


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

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.


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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.