Как написать скрипт runit custom stop

12

Я хочу, чтобы пользовательский скрипт "stop" runit( runsv) выполнялся, когда нужно остановить / перезапустить процесс. В настоящее время он просто убивает процесс, а затем запускает скрипт «finish». Но в моем случае мой процесс порождает динамически дочерние процессы, поэтому вместо простых killмне нужно "killtree"избавиться от них. Как я могу это сделать?

Я знаю, что это должно быть сделано с помощью controlпараметров runit, но после прочтения документации мне не совсем понятно, как назвать скрипт остановки :(

http://smarden.org/runit/runsv.8.html

ddinchev
источник
Ваш сервис (не скрипт, а программа) звучит не так, как надо, он должен пожинать / убирать после своих собственных детей. Просто любопытно, что это?
Эйвери Пэйн

Ответы:

13

Из документов

Для каждого управляющего символа c, отправляемого в канал управления, runv сначала проверяет, существует ли service / control / c и является ли он исполняемым. Если это так, он запускает service / control / c и ожидает его завершения, прежде чем интерпретировать команду. Если программа завершается с кодом возврата 0, runv воздерживается от отправки службе соответствующего сигнала. Команда o всегда рассматривается как команда u. По команде d сначала проверяется service / control / t, а затем service / control / d. По команде x сначала проверяется service / control / t, а затем service / control / x. Управление дополнительной службой журнала не может быть настроено.

Это означает, что вам нужно создать service_name/control/XX, являющийся исполняемым файлом, который будет запускаться при отправке связанной svкоманды службе, например, dкоманды (вниз). Если ваш скрипт завершает работу со статусом 0, он не будет пытаться отключить сам сервис.

По сути, вам нужен исполняемый скрипт, /etc/sv/<service>/control/dкоторый будет делать все, что вы захотите, и убить службу, очистить pids и т. Д.

CoreDump
источник
Это действительно интересно и просто, как работает RIVSV DIR.
Дзунг Нгуен
2

Простой ответ - назвать скрипт очистки "service / finish". Этот скрипт выполняется при выходе из «service / run».

Существует также интерфейс «service / control / ctrl_char». Он позволяет вам выполнять различные действия в зависимости от того, какую команду вы отправляете на runv.

Рик Шнайдер
источник
1
сервис / финиш выполняется после отправки TERM CONT в работающий сервис. Это больше похоже на очистку сервиса после kill.
МаксимКострикин
2

Я должен был решить эту проблему самостоятельно для докера. У меня был запущен сервер uwsgi, и докер (TERM вместо INT) отправил ему неправильный сигнал при остановке контейнера.

Идея файлов control / x состоит в том, чтобы реагировать на полученный сигнал. В моем случае я бы поместил tфайл для сигнала завершения в управление, так как это файл, зарезервированный для термина сигнала. Скрипт должен быть исполняемым.

#!/bin/bash
kill -INT `cat /tmp/project-master.pid`

Скрипт отправляет сигнал int процессу uwsgi, чего я и хочу.

Если управляющий скрипт завершает работу без ошибки (код возврата 0), исходный сигнал не будет отправлен процессу.

Таким образом, в моем случае я смог получить термин «сигнал» и вместо этого послать сигнал «int» процессу обслуживания.

itsafire
источник