Разрешение другим пользователям останавливать / перезапускать простые демоны bash - использовать сигналы или что?

У меня есть веб-сервер, на котором я запускаю несколько медленно запускаемых программ в качестве демонов. Иногда их требуется быстрый перезапуск (или остановка), когда я перекомпилирую их или переключаюсь на другую установку.

Я пишу сценарий, вдохновленный 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-файлами…)

6
задан unhammer 24 February 2012 в 15:42
поделиться