#!/bin/bash
for i in {1..3}; do
sem --no-notice --id $$ -j+0 sleep 10 ";" echo Done
done
sem --no-notice --id $$ --wait
Launch это, то, как сделать Ctrl + C прекратить все сны?убить все рабочие места, порожденных гипюром
#!/bin/bash
for i in {1..3}; do
sem --no-notice --id $$ -j+0 sleep 10 ";" echo Done
done
sem --no-notice --id $$ --wait
Launch это, то, как сделать Ctrl + C прекратить все сны?убить все рабочие места, порожденных гипюром
Вы можете использовать ловушки, чтобы поймать ваш сигнал SIGINT
и вручную уничтожить все процессы, порожденные семафорами. Взгляните на следующий сценарий:
#!/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
Объяснение:
trap kill_sem INT
: Деяния несколько к try ... catch
, подобным образом блоки на других языках, но с сигналами, а не исключением. Здесь он ждет сигнала INT
(CTRL + C) и выполняет функцию kill_sem
, когда это происходит. Link to trap documentation.
При создании семафора с sem
, это создаст файл, используя следующий шаблон именования: ~/.parallel/semaphore/id-MYSCRIPT_PID/[email protected]
$(basename ${s%%@*})
: извлекает SEM_PID
из всех этих файлов, и использовать его в качестве PID_GROUP
в командаkill -15 -- -PID_GROUP
убить: посылает сигнал SIGTERM
ко всем процессам, принадлежащим к группе PID_GROUP
Посмотрите, можете ли вы переписать свой код, чтобы использовать параллель в обычном режиме. Тогда это работает из коробки. (И рассмотрите возможность запуска --bibtex только один раз). –