Le script bash ne devrait tuer que les instances d'un autre script qu'il a lancé


11

Dans la situation actuelle, un certain script «calling.sh» lance un autre script «called.sh» en arrière-plan, effectue d'autres opérations, s'endort pendant un certain temps, puis termine «called.sh» par a pkill called.sh. Cela fonctionne bien.

Ensuite, je voudrais également lancer 'called.sh' à partir d'autres terminaux en tant que script autonome à tout autre moment, que ce soit avant ou après le lancement de calling.sh. Ces instances indépendantes ne doivent pas être supprimées par «calling.sh».

Comment puis-je atteindre cet objectif? L'intuition dit que le script appelant devrait être en mesure de dire au processus qu'il a démarré à partir de tout autre homonyme en cours d'exécution.

En variante, 'calling.sh' peut également lancer 'called' qui est un lien symbolique vers 'called.sh'. Est-ce que cela complique la gestion de la situation ci-dessus? Quelles précautions et ajustements spécifiques l'utilisation d'un lien symbolique nécessite-t-elle?


1
Je crois que le partage est spécifiquement destiné à cela: unix.stackexchange.com/a/450242/323121
Rusi

Réponses:


27

N'utilisez pas le nom pour le tuer. Puisque le calling.shscript appelle le processus que vous souhaitez tuer plus tard, utilisez simplement $!(de man bash):

! S'étend à l'ID de processus du travail le plus récemment placé en arrière-plan, qu'il soit exécuté en tant que commande asynchrone ou à l'aide de la fonction bgintégrée

Donc, si vous êtes calling.shcomme ça:

called.sh &
## do stuff
pkill called.sh

Changez-le en ceci:

called.sh &
calledPid=$!
# do stuff
kill "$calledPid"

4
Cela devrait fonctionner aussi longtemps que called.sh ne meurt pas par lui-même, car sinon son pid pourrait être réutilisé, tuant ainsi un processus innocent et indépendant.
Eugene Ryabtsev

2
@EugeneRyabtsev c'est un très bon point. Je suppose que vous pouvez également vérifier que le $calledPidPID parent du est le PID de called.sh.
terdon

Pour renforcer la réponse, voici
XavierStuvw

18

J'ai dû choisir cela, mais parmi les scripts tant de fois; c'est encore plus amusant lorsque les scripts sont appelés dans le cadre d'un programme automatisé complexe. Vous ne devriez vraiment pas vous fier à quelque chose comme pkillpour sélectionner le script à tuer.

Dans call.sh, vous devez enregistrer les PID des travaux que vous avez démarrés et les tuer explicitement par PID.

À l'intérieur de calling.sh:

./called.sh &
called_pid=$!

# Later
kill $called_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.