#!/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
#!/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
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 Befehlkill -15 -- -PID_GROUP
töten sendet das SIGTERM
Signal an alle Prozesse an die Gruppe PID_GROUP
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). –