сценарий оболочки для порождения процессов, завершения дочерних процессов на SIGTERM - PullRequest
6 голосов
/ 10 июня 2009

Я хочу написать скрипт оболочки, который порождает несколько длительных процессов в фоновом режиме, а затем зависает. После получения 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.

Редактировать: я использую Ubuntu 9.04

Ответы [ 4 ]

11 голосов
/ 01 февраля 2010

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

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

  • Задание сигнала EXIT полезно при использовании set -e (подробнее здесь ).

5 голосов
/ 10 июня 2009

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

Финальный скрипт выглядит так:

#!/bin/sh

sleep 600 &
PID1="$!"

sleep 600 &
PID2="$!"

trap "kill $PID1 $PID2" exit INT TERM

wait
4 голосов
/ 10 июня 2009

Я подозреваю, что ваш / bin / sh не Bash (хотя вы пометили вопрос как 'Bash').

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

1 голос
/ 10 июня 2009

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

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

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

...