Как перезапустить BASH-скрипт из себя с сигналом? - PullRequest
2 голосов
/ 12 января 2011

Например, у меня есть скрипт с бесконечным циклом, печатающий что-то на стандартный вывод.Мне нужно перехватить сигнал (например, SIGHUP), чтобы он перезапустил скрипт с другим PID, и цикл снова запустится с 0. Сбой и запуск не работают, как ожидалось:

function traphup(){  
    kill $0  
    exec $0
}  
trap traphup HUP

ВозможноЯ должен поместить что-то в фоновый режим или использовать nohup, но я не знаком с этой командой.

1 Ответ

3 голосов
/ 12 января 2011

В вашей функции:

traphup(){
    $0 "$@" &
    exit 0
}

Это запускает новый процесс в фоновом режиме с исходным именем команды и аргументами (варьируйте аргументы в соответствии с вашими требованиями) с новым идентификатором процесса. Исходная оболочка затем выходит. Не забудьте отсортировать файл PID, если ваш демон использует его для идентификации себя, но перезапуск может сделать это в любом случае.

Обратите внимание, что использование nohup будет неправильным направлением; в первый раз, когда вы запускаете демон, он будет реагировать на сигнал HUP, но тот, который запущен с nohup, будет игнорировать сигнал, не перезапускаясь - если вы явно не переопределите состояние «игнорировать», что является плохой идеей для различных причины.


Ответ на комментарий

Я не совсем уверен, в чем проблема.

Когда я запускаю следующий скрипт, я вижу только одну копию скрипта в выводе ps, независимо от того, запускаю ли я его как ./xx.sh или как ./xx.sh &.

#!/bin/bash

traphup()
{
    $0 "$$" &
    exit 0
}

trap traphup HUP
echo
sleep 1

i=1
while [ $i -lt 1000 ]
do
    echo "${1:-<none>}: $$: $i"
    sleep 1
    : $(( i++ ))
done

Вывод содержит строки, такие как:

<none>: 1155: 21
<none>: 1155: 22
<none>: 1155: 23

1155: 1649: 1
1155: 1649: 2
1155: 1649: 3
1155: 1649: 4

Те, у которых есть <none>, являются исходным процессом; второй набор - это дочерний процесс (1649), сообщающий о своем родителе (1155). Этот вывод позволил легко отслеживать, в какой процесс отправлять сигналы HUP. (Начальный echo и sleep выводит приглашение командной строки из пути вывода.)

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

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