люди. Я пытаюсь написать демон, который в основном бездействует и ждет заданное количество времени перед выполнением кратковременной команды. Поскольку некоторые системы могут быть прерваны при переходе в спящий режим, я делю период ожидания (например, 4 часа) на меньшие периоды, запускающие их в течение -1 oop, чтобы обойти скачок времени при пробуждении системы, чтобы не запускать команду для довольно часто. Все было прекрасно, пока мой скромный сценарий не был выполнен на переднем плане. Но если я попытаюсь демонизировать его с помощью start-stop-daemon, чтобы он мог работать как системный сервис, все становится неприятно. Вот как я запускаю скрипт:
start()
{
ebegin "Starting trimd"
checkconfig || return 1
start-stop-daemon --start \
--exec ${DAEMON} \
--pidfile ${PID} \
--background \
--make-pidfile \
--ionice ${IONICE} \
--nice ${NICE} \
--stdout-logger '/usr/bin/logger --tag trimd'
eend $?
}
Он запускается и работает очень хорошо, но если я пытаюсь остановить его, используя следующий раздел:
stop()
{
ebegin "Stopping trimd"
start-stop-daemon --stop \
--exec ${DAEMON} \
--pidfile ${PID}
eend $retval
}
Это фактически остановит основной процесс, но оставит сиротские процессы сна и ведения журнала, которые мне придется уничтожить вручную. Я испробовал несколько хитростей: отправлял разные сигналы с помощью start-stop-daemon, например TERM, - он не работает, сообщая «демон отказался останавливаться» и перехватывая сигналы вроде этого:
cleanup() {
local PIDS=$(jobs -p)
[ -n "$pids" ] && kill $pids
echo $PIDS
exit 1
}
trap "cleanup" INT QUIT TERM EXIT SIGTERM
также безуспешно. Итак, возможно ли убить целое поддерево процесса с помощью start-stop-daemon или какой-то хитрости внутри самого скрипта bash?