2009-06-10 2 views
6

Я хочу написать сценарий оболочки, который порождает несколько длительных процессов в фоновом режиме, а затем зависает. Получив SIGTERM, я хочу, чтобы все подпроцессы также прекращались.сценарий оболочки для запуска процессов, завершение дочерних элементов на SIGTERM

В принципе, я хочу «мастер-процесс».

Вот что я получил до сих пор:

#!/bin/sh 

sleep 600 & 
PID1="$!" 

sleep 600 & 
PID2="$!" 

# supposedly this should kill the child processes on SIGTERM. 
trap "kill $PID1 $PID2" SIGTERM 

wait 

Данный скрипт завершается с trap: 10: SIGTERM: bad trap.

Edit: Я использую Ubuntu 9.04

ответ

5

Ответ Джо поставил меня на правильный путь. Я также обнаружил, что должен ловить больше сигналов, чтобы покрыть мои базы.

Окончательный сценарий выглядит следующим образом:

#!/bin/sh 

sleep 600 & 
PID1="$!" 

sleep 600 & 
PID2="$!" 

trap "kill $PID1 $PID2" exit INT TERM 

wait 
+1

Если вы считаете, что вам нужно использовать номера сигналов, вы должны использовать только стандартные. Но я стараюсь использовать вместо этого имена сигналов вашей системы. – TheBonsai

+0

Вы правы. Я надеюсь, что это последняя версия ... – itsadok

+0

Ну, это ваш код, у вас может быть столько версий, сколько нужно ;-) – TheBonsai

1

Этот сценарий выглядит правильно и работает для меня, как и ожидалось.

Как вы отправляете сигнал SIGTERM на «главный процесс»? Возможно, вам нужно выполнить kill -l, чтобы проверить, какие сигналы поддерживаются. В сообщении об ошибке предлагается отправить сигнал «10», который, как кажется, не распознает ваша система.

И в следующий раз, вы должны добавить операционную систему, версию оболочки, ядро ​​... для такого вопроса

+0

Благодарим за отзыв. Я использую Ubuntu 9.04, и, читая ваш ответ, я понял, что это, вероятно, проблема с bash vs dash. Это действительно работает, если я изменил первую строку на #!/Bin/bash. – itsadok

4

Я подозреваю, что ваш/бен/ш не является Bash (хотя вы помечено вопрос как «Bash»).

Из сообщения, я думаю, это DASH. Проверьте его руководство или просто исправьте свой shebang, если вам нужно написать код Bash.

10

Это работает для меня:

trap "trap - SIGTERM && kill -- -$$" SIGINT SIGTERM EXIT 
  • kill -- -$$ посылает SIGTERM ко всей группе процессов, тем самым убивая также потомков.

  • Указательный сигнал EXIT полезен при использовании set -e (подробнее here).

+0

Что означает pid 0? И вы имеете в виду «...» буквально, или в качестве заполнителя? – itsadok

+0

Как-то это работало только для меня, когда я использовал 'kill - 0' вместо' kill - - $$'. Последний сказал «11641: никакой процесс не найден» по какой-то причине. – WorldSEnder

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