Убить все дочерние процессы скрипта bash с помощью start-stop-daemon - PullRequest
0 голосов
/ 31 января 2020

люди. Я пытаюсь написать демон, который в основном бездействует и ждет заданное количество времени перед выполнением кратковременной команды. Поскольку некоторые системы могут быть прерваны при переходе в спящий режим, я делю период ожидания (например, 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?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...