Як написати спеціальний сценарій runit runit


12

Я хочу мати користувальницький "стоп" скрипт runit( runsv) для виконання, коли потрібно зупинити / перезапустити процес. В даний час він просто вбиває процес, після чого запускає сценарій "фінішу". Але в моєму випадку мій процес динамічно породжує дочірні процеси, тому замість простих killмені потрібно "killtree"позбутися від них. Як це зробити?

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

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


Ваша служба (не сценарій, а програма) звучить неправильно, вона повинна збиратись та очищатись після своїх дітей. Просто цікаво, що це?
Avery Payne

Відповіді:


13

Від док

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

Це означає, що вам потрібно створити a service_name/control/X, X - виконуваний файл, який запускатиметься, коли ви надсилаєте відповідну svкоманду до служби, як-от dкоманда (вниз). Якщо ваш сценарій закінчується зі статусом 0, він не намагатиметься знищити саму службу.

В основному вам потрібен виконуваний скрипт, /etc/sv/<service>/control/dякий буде робити все, що вам завгодно, і вбиватиме службу, прибиратиме підставки та ін.


це дійсно цікаво і просто, як працює runv dir.
Дзунг Нгуен

2

Проста відповідь - назвати сценарій очищення "послуга / закінчення". Цей сценарій виконується, коли "служба / запуск" закінчується.

Існує також "сервіс / управління / ctrl_char інтерфейс. Він дозволяє виконувати різні дії залежно від того, яку команду ви відправляєте в runv.


1
сервіс / закінчення працює після надсилання TERM CONT до запущеної служби. Це більше схоже на службу очищення після вбивства.
МаксимКострикін

2

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

Ідея файлів control / x полягає в тому, щоб реагувати на отриманий сигнал. У моєму випадку я б поклав на контроль tфайл для сигналу закінчення, оскільки це файл, зарезервований для терміна сигналу. Сценарій повинен бути виконаним.

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

Сценарій посилає сигнал int до процесу uwsgi, чого я хочу.

Якщо сценарій управління виходить без помилки (код повернення 0), вихідний сигнал не буде надсилатися в процес.

Тож у моєму випадку я зміг приймати термінний сигнал і надсилати натомість сигнал int до сервісного процесу.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.