Écrire un fichier PID manuellement à partir du script Bash


10

Comment pourrais-je écrire un script Bash qui exécute un programme de longue durée et stocke l'ID de processus des programmes dans un fichier séparé?

Je veux quelque chose comme

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

Cependant, faire exactement cela exécuterait l' outilps après la fin.

Existe-t-il un moyen d'obtenir l'ID de processus du processus créé?


2
Votre exemple de code ne fonctionnera pas car exec ne se bifurque pas, donc le processus shell est remplacé par le long_running_toolprocessus. Par conséquent, exec ne revient jamais et la ligne suivante n'est jamais atteinte. Voir help exec, execve(2).
Etienne Dechamps

@ e-t172 merci de l'avoir signalé. Je supprime alors 'exec'.
DerMike

Réponses:


12

Vous pouvez facilement exécuter le processus en arrière-plan avec "&", puis obtenir le PID du processus en arrière-plan en utilisant "$!"

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

Ensuite, facultativement, attendez $! si vous voulez que le shell se bloque jusqu'à la fin de l'exécution du processus.


1
MISE À JOUR: lorsque j'utilise le fg, j'obtiens 'fg: 21: job (null) non créé sous le contrôle du job' et le script ne se bloque pas. Désolé.
DerMike

"attends $!" devrait avoir un effet similaire à fg que je peux confirmer fonctionne en fait dans un script. J'aurais probablement dû vérifier cela avant de poster. >.> mon mauvais.
Jeremy Sturdivant du

9
#!/bin/bash
echo $$ > fooapp.pid
exec fooapp

Comme mentionné précédemment, exec remplace bash par le programme spécifié, en conservant le PID.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.