3 votes

Tuer tous les travaux engendrés par sem

#!/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 ?

1voto

Aserre Points 3313

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 kill
    • kill -15 -- -PID_GROUP : envoie le SIGTERM à tous les processus appartenant au groupe PID_GROUP

Prograide.com

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.

Powered by:

X