2017-01-24 6 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 

Launch это, то, как сделать Ctrl + C прекратить все сны?убить все рабочие места, порожденных гипюром

+0

Посмотрите, можете ли вы переписать свой код, чтобы использовать параллель в обычном режиме. Тогда это работает из коробки. (И рассмотрите возможность запуска --bibtex только один раз). –

ответ

1

Вы можете использовать ловушки, чтобы поймать ваш сигнал 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

 Смежные вопросы

  • Нет связанных вопросов^_^