É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éé?

DerMike
la source
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
2
Veuillez consulter Gestion des processus .
pause jusqu'à nouvel ordre.

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.

Jeremy Sturdivant
la source
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.

user1686
la source