Я хочу, чтобы пользовательский скрипт "stop" runit
( runsv
) выполнялся, когда нужно остановить / перезапустить процесс. В настоящее время он просто убивает процесс, а затем запускает скрипт «finish». Но в моем случае мой процесс порождает динамически дочерние процессы, поэтому вместо простых kill
мне нужно "killtree"
избавиться от них. Как я могу это сделать?
Я знаю, что это должно быть сделано с помощью control
параметров runit, но после прочтения документации мне не совсем понятно, как назвать скрипт остановки :(
Ответы:
Из документов
Это означает, что вам нужно создать
service_name/control/X
X, являющийся исполняемым файлом, который будет запускаться при отправке связаннойsv
команды службе, например,d
команды (вниз). Если ваш скрипт завершает работу со статусом 0, он не будет пытаться отключить сам сервис.По сути, вам нужен исполняемый скрипт,
/etc/sv/<service>/control/d
который будет делать все, что вы захотите, и убить службу, очистить pids и т. Д.источник
Простой ответ - назвать скрипт очистки "service / finish". Этот скрипт выполняется при выходе из «service / run».
Существует также интерфейс «service / control / ctrl_char». Он позволяет вам выполнять различные действия в зависимости от того, какую команду вы отправляете на runv.
источник
Я должен был решить эту проблему самостоятельно для докера. У меня был запущен сервер uwsgi, и докер (TERM вместо INT) отправил ему неправильный сигнал при остановке контейнера.
Идея файлов control / x состоит в том, чтобы реагировать на полученный сигнал. В моем случае я бы поместил
t
файл для сигнала завершения в управление, так как это файл, зарезервированный для термина сигнала. Скрипт должен быть исполняемым.Скрипт отправляет сигнал int процессу uwsgi, чего я и хочу.
Если управляющий скрипт завершает работу без ошибки (код возврата 0), исходный сигнал не будет отправлен процессу.
Таким образом, в моем случае я смог получить термин «сигнал» и вместо этого послать сигнал «int» процессу обслуживания.
источник