У меня есть веб-сервер, на котором я запускаю несколько медленно запускаемых программ в качестве демонов. Иногда их требуется быстрый перезапуск (или остановка), когда я перекомпилирую их или переключаюсь на другую установку.
Я пишу сценарий, вдохновленный 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
. (Кроме того, это позволяет запускать демонов
при перезагрузке, и все равно убить их чисто.)
Есть ли лучшее решение? Есть ли очевидные проблемы с этим решение, которое я не вижу?
(Прочитав Bash Wiki Грега, я бы хотел избежать решения, связанного с pgrep или PID-файлами…)