Назад | Перейти на главную страницу

Как написать собственный сценарий остановки runit

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

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

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

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

Для каждого управляющего символа 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/X, X - исполняемый файл, который будет запущен, когда вы отправите связанный sv команда сервису, как и d команда (вниз). Если ваш сценарий завершается со статусом 0, он не будет пытаться отключить саму службу.

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

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

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

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

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

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

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

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

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