Я пытаюсь запустить программу с интерфейсом ncurse в качестве демона, используя экран. Я хочу использовать start-stop-daemon для управления процессом, но у меня возникают проблемы при создании сценария инициализации SysV.
Переменные:
NAME=rtorrent
CHDIR=/opt/$NAME
DAEMON=$NAME
DAEMON_ARGS="-d -m -S $NAME $DAEMON &> /dev/null"
USER=media
GROUP=media
PIDFILE=/var/run/$NAME.pid
В настоящее время моя функция запуска:
do_start()
{
# Return
# 0 if daemon has been started
# 1 if daemon was already running
# 2 if daemon could not be started
pgrep -F $PIDFILE > /dev/null 2>&1 || return 1
start-stop-daemon --start --quiet --make-pidfile --pidfile $PIDFILE --chuid $USER:$GROUP --chdir $CHDIR --background --exec screen -- $DAEMON_ARGS || return 2
}
Но это хранит идентификатор процесса sleep
. По-видимому, демон мог выйти из строя и оставить процесс sleep
запущенным.
Моя функция остановки должна остановить оба, поэтому у меня есть:
do_stop()
{
# Return
# 0 if daemon has been stopped
# 1 if daemon was already stopped
# 2 if daemon could not be stopped
pgrep -F $PIDFILE > /dev/null 2>&1 || return 1
for i in `ps -C $NAME -o pid=` ; do kill $i ; done
pgrep -F $PIDFILE > /dev/null 2>&1 || return 2
# Many daemons don't delete their pidfiles when they exit.
rm -f $PIDFILE
}
Который должен работать (еще не проверено), но с проблемой, что он приведет к остановке любого другого процесса, созданного любым другим пользователем с $NAME
как в его имени или аргументах.
Я думаю, что мое решение состоит в том, чтобы моя функция ps
возвращала только pids имен процессов $NAME
, которые были созданы $USER
. Поскольку этот демон будет запущен под выделенным идентификатором пользователя.
Я не уверен, как получить этот вывод. ps -C $NAME -u $USER o pid=
дает мне список для каждого совпадения, но я хочу один список для обоих совпадений. Incase Я решаю, что этот пользователь может обработать какой-то другой процесс позже.
Кроме того, как насчет перезагрузки?
start-stop-daemon --stop --signal 1 --quiet --pidfile $PIDFILE --name $NAME
перезагрузит процесс screen
, перезагрузит ли он демон? Есть ли способ лучше?
Любая помощь с благодарностью.