2017-01-24 3 views
2
#!/bin/bash 

for i in {1..3}; do 
    sem --no-notice --id $$ -j+0 sleep 10 ";" echo Done 
done 

sem --no-notice --id $$ --wait 

Starten Sie es, dann, wie Ctrl +C machen alle Betten zu beenden?Tötet alle Aufträge von sem gelaicht

+0

Sehen Sie, ob Sie Ihren Code neu schreiben können, um stattdessen parallel im normalen Modus zu verwenden. Dann funktioniert es aus der Box. (Und erwäge, --bibtex nur einmal auszuführen). –

Antwort

1

Sie könnten Traps verwenden, um Ihr Signal SIGINT abzufangen und alle von Ihren Semaphoren erzeugten Prozesse manuell zu beenden. Werfen Sie einen Blick auf das folgende Skript:

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

Erläuterung:

  • trap kill_sem INT: Wirkt etwas Ähnlich zu try ... catch Blöcke in anderen Sprachen, aber mit Signalen eher als Ausnahme. Hier wartet es auf das Signal INT (CTRL + C) und führt die Funktion kill_sem aus, wenn dies geschieht. Link to trap documentation.

  • Wenn Sie eine Semaphore mit sem erstellen, wird es eine Datei mit dem folgende Namensmuster erstellen: ~/.parallel/semaphore/id-MYSCRIPT_PID/[email protected]

    • $(basename ${s%%@*}): extrahiert die SEM_PID aus allen diesen Dateien, und es als PID_GROUP in der Verwendung Befehl
    • kill -15 -- -PID_GROUP töten sendet das SIGTERM Signal an alle Prozesse an die Gruppe PID_GROUP
  • gehören,
Verwandte Themen