Je veux exécuter deux commandes simultanément en bash sur une machine Linux. Par conséquent, dans mon ./execute.sh
script bash, je mets:
command 1 & command 2
echo "done"
Cependant, lorsque je veux arrêter le script bash et appuyer sur Ctrl+ C, seule la deuxième commande est arrêtée. La première commande continue de s'exécuter. Comment m'assurer que le script bash complet est arrêté? Ou dans tous les cas, comment arrêter les deux commandes? Parce que dans ce cas, peu importe la fréquence à laquelle j'appuie sur Ctrl+, Cla commande continue de fonctionner et je suis obligé de fermer le terminal.
Réponses:
Si vous tapez
c'est égal à
c'est à dire que cela exécutera la première commande en arrière-plan, puis exécutera la deuxième commande en premier plan. Cela signifie en particulier que votre
echo "done"
est imprimé une foiscommand 2
terminé, même s'ilcommand 1
est toujours en cours d'exécution.Tu veux probablement
Cela exécutera les deux commandes en arrière-plan et attendra que les deux se terminent.
Si vous appuyez sur CTRL-C, cela n'enverra que le signal SIGINT au processus de premier plan, c'est-
command 2
à- dire dans votre version ouwait
dans ma version.Je suggère de mettre un piège comme ça:
Avec le piège, le signal SIGINT produit par CTRL-C est piégé et remplacé par la
killgroup
fonction, qui tue tous ces processus.la source
set -x
au début de votre script pour imprimer les commandes qui sont exécutées.Lorsque vous placez une commande en arrière-plan à partir d'un script, le PID ne s'affiche pas à l'écran. Vous pouvez utiliser la variable intégrée
$!
qui stocke le PID du dernier processus afin que vous puissiez capturer le PID de command1.ferait écho au PID de command1.
Bash fournit également le piège intégré que vous pouvez utiliser pour enregistrer une séquence de commandes à exécuter lorsque des signaux particuliers sont reçus. Vous pouvez l'utiliser pour attraper la commande SIGINT et kill1 avant de quitter le script principal, par exemple
Maintenant, pendant que la commande 2 est en cours d'exécution, la frappe Ctrl Centraînera l'envoi à la fois de la commande1 et de la commande2 SIGINT.
la source
%n
syntaxe pour supprimer des travaux d'arrière-plan spécifiques dans ce shell. Habituellement, vous émettezkill %1
pour tuer le dernier et le seul processus d'arrière-plan. Avec plus de processus d'arrière-plan, utilisezjobs
pour voir la liste en premier.Les nouvelles versions de GNU Parallel feront ce que vous voulez:
Ou si
command
reste le même:Regardez la vidéo d'introduction pour une introduction rapide: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1
Parcourez le didacticiel (man parallel_tutorial). Vous commandez en ligne avec amour pour vous.
la source
Ctrl+ Cenvoie un signal SIGINT à votre processus frontal, ce qui est
command2
.command1
est exécuté en arrière-plan, donc pas concerné par le flux d'entrée.Lorsque vous tapez
command1 &
, bash devrait vous donner le PID du processus, quelque chose comme[1234]
. Pour tuer ce processus, vous pouvez utiliserkill 1234
. Maintenant, si vous avez les PID des deuxcommand1
etcommand2
(jetez un œil àps -ef
), vous pouvez les utiliserkill
pour les terminer tous:Une petite astuce serait d'exécuter les deux commandes en arrière-plan, avec:
Bash vous donnera les deux PID, prêts à être tués. Une autre astuce serait de ramener
command1
au premier plan une fois que vous avez tuécommand2
:Plus d'informations disponibles ici: http://linuxg.net/how-to-manage-background-and-foreground-processes/
la source