остановить сценарий оболочки в фоновом режиме, отправив сигнал - PullRequest
4 голосов
/ 27 мая 2011

У меня есть сценарий оболочки bash S1, который запускает другой сценарий оболочки S2 (содержит только sleep 20) синхронно, то есть на переднем плане.

Я хочу следующее:

Когда я отправляю SIGTERM или SIGINT на S1, оба S1 и S2 должны прекратиться.

На самом деле это работает, если я запускаю S1 в командной строке на переднем плане и если я нажимаю CTRL-C (независимо от того, ловлю ли я SIGINT в сценариях явно или нет).

Когда я запускаю S1 в фоновом режиме, а затем отправляю ему сигнал SIGINT с kill -s SIGINT $!, пока S2 не прекратит свою нормальную обработку, то есть S2 не прервется.

Мой вариант использования - последний, и мне нужен способ прервать как S1, так и S2, отправив сигнал только на S1.

Ответы [ 2 ]

2 голосов
/ 27 мая 2011

Если вы запускаете S1 из командной строки, отправьте сигнал всем процессам в группе процессов, используя спецификацию задания, начинающуюся с%, например kill -INT %+.

Если вы запускаетеS1 из другого скрипта S3, возможно, он должен заканчиваться S1 и S2 на SIGINT, что сводится к приведенному выше.В противном случае вы можете попробовать использовать управление заданиями, например

set -m
S1 &
set +m
pid=$!
...
kill -INT -- -$pid

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

2 голосов
/ 27 мая 2011

S1.sh:

#!/bin/sh

on_term()
{
    echo "S1: Sending TERM to S2.sh"
    pkill -TERM S2.sh
    echo "S1: Waiting for S2 to complete..."
}

trap "on_term" TERM

echo "S1: Forking a child..."

./S2.sh &

while [ 1 == 1 ]; do
    wait
    if [ $? -eq 0 ]; then
        break
    fi
done

echo "S1: Done!"

S2.sh:

#!/bin/sh

on_term()
{
    echo "S2: Terminating..."
    exit -1
}

trap "on_term" TERM

echo "S2: Sleeping..."

sleep 5

echo "S2: Done!"

Веселись!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...