В вашей функции:
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 выводит приглашение командной строки из пути вывода.)
Я подозреваю, что то, что вы видите, зависит от содержания вашего скрипта - в моем случае тело цикла простое. Но если бы у меня был конвейер или что-то там, я мог бы увидеть второй процесс с тем же именем. Но я не думаю, что это изменится в зависимости от того, выполняется ли оригинальный сценарий на переднем или заднем плане.