У меня есть веб-сервер, на котором я запускаю несколько медленно запускающихся программ в качестве демонов. Иногда они нуждаются в быстром перезапуске (или остановке), когда я перекомпилирую их или переключаюсь на другую установку.
Вдохновленный http://mywiki.wooledge.org/ProcessManagement, Я пишу сценарий
называется daemonise.sh
, который выглядит как
#!/bin/sh
while :; do
./myprogram lotsadata.xml
echo "Restarting server..." 1>&2
done
чтобы "демон" работал. Так как мне иногда нужно это остановить, или просто
перезапустите его, я запускаю этот скрипт в сеансе экрана, например:
$ ./daemonise.sh & DPID=$!
$ screen -d
Тогда, возможно, я перекомпилирую мою программу, установлю ее по новому пути, начну
новый и хотите убить старого:
$ screen -r
$ kill $DPID
$ screen -d
Это прекрасно работает, когда я единственный сопровождающий, но теперь я хочу дать
кто-то другой остановит / перезапустит программу, не важно, кто ее запустил. А также
чтобы усложнить ситуацию, скрипт daemonise.sh
на самом деле
запускает около 16 программ, что затрудняет убить каждую
если вы не знаете их PID.
Каким будет «лучший метод», позволяющий другому пользователю
остановить / перезапустить демонов?
Я думал о сеансах с общим экраном, но это звучит просто глупо и
небезопасный. Лучшее решение, которое я нашел на данный момент, - это завернуть
запуск и убийство в скрипте, который ловит определенные сигналы:
#!/bin/bash
DPID=
trap './daemonise.sh & DPID=$!' USR1
trap 'kill $DPID' USR2 EXIT
# Ensure trapper wrapper doesn't exit:
while :; do
sleep 10000 & wait $!
done
Теперь, если другому пользователю нужно остановить демонов, а я не могу этого сделать,
она просто должна знать pid обертки, и, например, sudo kill -s
USR2 $wrapperpid
. (Также это позволяет запускать демоны
перезагружается и все равно убивает их чисто.)
Есть ли лучшее решение? Есть ли очевидные проблемы с этим
Решение, которое я не вижу?
(Прочитав Breg Wiki Грега, я бы хотел избежать решения, связанного с pgrep или PID-файлами ...)