#!/bin/bash
for i in {1..3}; do
sem --no-notice --id $$ -j+0 sleep 10 ";" echo Done
done
sem --no-notice --id $$ --wait
Lancez-le, alors comment faire Ctrl + C pour mettre fin à tous les dodos ?
#!/bin/bash
for i in {1..3}; do
sem --no-notice --id $$ -j+0 sleep 10 ";" echo Done
done
sem --no-notice --id $$ --wait
Lancez-le, alors comment faire Ctrl + C pour mettre fin à tous les dodos ?
Vous pourriez utiliser des pièges pour attraper vos SIGINT
et tuer manuellement tous les processus engendrés par vos sémaphores. Jetez un coup d'oeil au script suivant :
#!/bin/bash
shopt -s nullglob #safety needed so that globs return empty strings when no files are present
trap kill_sem INT
function kill_sem() {
for s in ~/.parallel/semaphores/id-$$/*@*;
do
kill -15 -- -$(basename ${s%%@*})
done
}
for i in {1..3}; do
sem --no-notice --id $$ -j+0 sleep 45 ";" echo Done
done
sem --no-notice --id $$ --wait
Explication :
trap kill_sem INT
: Agit de façon similaire à try ... catch
dans d'autres langues, mais avec des signaux plutôt que des exceptions. Ici, il attend que le INT
signal ( CTRL + C ) et exécute le kill_sem
lorsque cela se produit. Lien vers la documentation sur les pièges .
Lorsque vous créez un sémaphore avec sem
il créera un fichier en utilisant le modèle de nom suivant : ~/.parallel/semaphore/id-MYSCRIPT_PID/SEM_PID@HOST
$(basename ${s%%@*})
: extrait le SEM_PID
de tous ces fichiers, et de l'utiliser comme la PID_GROUP
dans la commande killkill -15 -- -PID_GROUP
: envoie le SIGTERM
à tous les processus appartenant au groupe PID_GROUP
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.