start-stop-daemon не работает должным образом, файл pid не был записан

17

Я пытаюсь управлять программой на основе Python (которая не отсоединяется от консоли)

#!/bin/bash

user=nobody
pid=/var/run/xx.pid
name=xx
prog=/xx.py

case $1 in
    start)
        /sbin/start-stop-daemon --start -b --oknodo --user "$user" --name "$name" --pidfile "$pid" --startas "$prog" --chuid nobody -- --daemon
        ;;
    stop)
        /sbin/start-stop-daemon --stop --oknodo --user "$user" --name "$name" --pidfile "$pid" --retry=TERM/5/KILL/1
        ;;
    restart)
        ;;
    *)
        ;;
esac

Начальная часть работает нормально. Я вижу, что скрипт запущен и работает, но часть остановки - нет. Это просто говоритNo xx found running; none killed.

Итак, я думаю, что-то не так с начальной частью?

маргаритка
источник

Ответы:

22

start-stop-daemon --start --pidfile "$pid"не записывает в файл pid, если не указано --make-pidfile( -m). Без --make-pidfileэтого до запуска программы, чтобы создать его. Также для --make-pidfileработы запускаемый процесс не может демонизировать себя (через форк), так как тогда start-stop-daemonне будет знать, какой PID он должен поместить в файл.

Единственное, что --pidfile "$pid"делает в вашем сценарии использования, это то, что он start-stop-daemonне запустит программу, если она уже запущена.


Если процесс по-прежнему не останавливается, все критерии, которые были переданы, start-stop-daemon --stopдолжны соответствовать. Значение $pidдолжно быть запущенным процессом, UID процесса должен совпадать $user, а имя процесса (arg0) должно совпадать $name.
Вы можете определить значение arg0, выполнивps h -p $pid -o comm

Патрик
источник
Хорошо, pid-файл написан. Но остановить часть все еще не работает, то же сообщение об ошибке
маргаритка
@ warl0ck - это правильный файл pid, и совпадают $userли UID процесса ?
Патрик
Да, я видел, что start-stop-daemon пытался прочитать /proc/pid/stat: read(4, "5559 (python) S 1 5558 5558 0 -1"..., 1024) = 326так что, возможно, имя должно быть pythonвместо этого?
маргаритка
Готово, подставили имя pythonи все заработало ;-P
маргаритка
Да, да, $nameтоже должно совпадать. Полностью пропустил, что вы передавали это. Обновит ответ.
Патрик