J'utilise souvent bash
des scripts shell pour exécuter des commandes simples pour de nombreux fichiers différents. Par exemple, supposons que j'ai le suivant bash
script shell, appelé script.sh
, qui exécute le programme / commande foo
sur trois fichiers texte "a.txt"
, "b.txt"
, "c.txt"
:
#!/bin/bash
for strname in "a" "b" "c"
do
foo $strname".txt"
done
Supposons également que cela foo $strname".txt"
soit lent, de sorte que l'exécution du script prendra beaucoup de temps (heures ou jours, par exemple). Pour cette raison, je voudrais utiliser nohup
pour que l'exécution continue même si le terminal est fermé ou déconnecté. J'aimerais également que le script passe immédiatement en arrière-plan, je vais donc utiliser l' &
opérateur. J'utiliserai donc la commande suivante pour appeler script.sh
:
nohup bash script.sh &
Cela fonctionne très bien pour exécuter le script en arrière-plan et sans raccrocher, mais supposons maintenant que je souhaite terminer 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 top
, je ne vois que le foo
correspondant à "a.txt"
. Je peux mettre fin à cet foo
appel, mais le foo
correspondant à "b.txt"
est appelé et je dois également terminer celui-ci, etc. Pour des dizaines ou des centaines de fichiers texte spécifiés dans la for
boucle, il devient difficile de terminer chaque foo
, un par un! Donc, d'une manière ou d'une autre, j'ai besoin de mettre fin au script shell lui - même , pas aux appels particuliers émis à partir du script shell.
Quand je tape la commande
ps -u myusername
où myusername
est mon nom d'utilisateur, j'obtiens une liste des processus que j'exécute. Mais je vois deux ID de processus différents appelés bash
. Comment savoir lequel de ces processus, le cas échéant, correspond à mon appel d'origine nohup bash script.sh &
?
for s in a b c; do foo "$s".txt; done
nohup
aura longtemps que vous n'aurez plus de liste de processus pour voir le travail que vous avez commencé. Vous pouvez regarder la colonne "gentillesse" dans laps
sortie mais les réponses ici sont plus utiles.Réponses:
Par défaut,
ps
n'affichera pas les paramètres avec lesquels le programme a été appelé. Les options-f
et les-l
deux afficheront l'appel complet.entraînera une sortie qui ressemble à:
la source
Vous avez plusieurs options. Puisque votre processus s'exécute en arrière-plan, vous pouvez utiliser
jobs
pour le trouver:Vous pouvez également utiliser
pkill
pour rechercher dans la table de processus une correspondance de ligne de commande; à savoir:la source
La
ps
sortie (avec par exempleps aux
) inclut l'ID de processus du parent. Tuez le parentbash
et ses enfants seront également supprimés.Pour une visualisation ASCII de l'arborescence des processus, essayez
pstree -p
avec quelques processus d'arrière-plan en cours d'exécution.la source