Terminer un script shell bash en cours d'exécution en arrière-plan

J'utilise souvent des scripts shell bash pour exécuter des commands simples pour de nombreux files différents. Par exemple, supposons que j'ai le script shell bash suivant, appelé script.sh , qui exécute le programme / command foo sur trois files text "a.txt" , "b.txt" , "c.txt" :

 #!/bin/bash for strname in "a" "b" "c" do foo $strname".txt" done 

En outre, supposons que foo $strname".txt" soit lent, donc l'exécution du script prendra beaucoup de time (heures ou jours, par exemple). Pour cette raison, je voudrais utiliser nohup afin que l'exécution continue même si le terminal est fermé ou déconnecté. Je voudrais aussi que le script passe immédiatement à l'arrière-plan, donc je vais utiliser l'opérateur & . Ainsi, j'utiliserai la command suivante pour appeler script.sh :

 nohup bash script.sh & 

Cela fonctionne bien pour exécuter le script en arrière-plan et sans raccrocher, mais maintenant supposons que je voudrais mettre fin à l'exécution à un moment donné pour une raison quelconque. Comment puis-je faire ceci?

Le problème que j'ai rencontré est qu'en regardant en top , je ne vois que le foo correspondant à "a.txt" . Je peux mettre fin à cet appel foo , mais ensuite le foo correspondant à "b.txt" est appelé et ensuite je dois terminer celui-là aussi, et ainsi de suite. Pour des dizaines ou des centaines de files text spécifiés dans la boucle for , il devient difficile de terminer chaque foo , un par un! Donc, d'une manière ou d'une autre, je dois plutôt mettre fin au script shell luimême , pas aux appels particuliers issus du script shell.

Quand je tape la command

 ps -u myusername 

myusername est mon nom d'user, j'obtiens la list des process que myusername . Mais je vois deux ID de process différents appelés bash . Comment savoir lequel de ces process, le cas échéant, correspond à mon appel d'origine nohup bash script.sh & ?

Par défaut, ps ne montrera pas les parameters avec lesquels le programme a été appelé. Les options -f et -l afficheront l'appel complet.

 ps -fu username 

se traduira par une sortie qui ressemble à:

 username 23464 66.7 0.0 11400 628 pts/5 R 15:28 1:40 bash script.sh 

Vous avez plusieurs options. Comme votre process s'exécute en arrière-plan, vous pouvez utiliser les jobs pour le find:

 nohup bash script.sh & ... jobs [1]+ Running nohup bash script.sh & kill %1 jobs [1]+ Terminated nohup bash script.sh & 

Vous pouvez également utiliser pkill pour searchr dans la table de process une correspondance de command line; à savoir:

 pkill -f script.sh 

La sortie ps (avec par exemple ps aux ) inclut l'ID de process du parent. Tuez le parent bash , et ses enfants, aussi, seront terminés.

Pour une visualisation ASCII de l'tree de process, essayez pstree -p avec quelques process d'arrière-plan en cours d'exécution.