Я пытаюсь запустить программу с интерфейсом 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 , перезагрузит ли он демон? Есть ли способ лучше?
Любая помощь с благодарностью.
