Cómo escribir un script de detención personalizado runit

12

Quiero tener un script "stop" personalizado runit( runsv) para ejecutar cuando tenga que detener / reiniciar el proceso. Actualmente, simplemente mata el proceso, luego ejecuta el script "terminar". Pero en mi caso, mi proceso genera dinámicamente procesos secundarios, por lo que en lugar de simple kill, necesito un "killtree"para deshacerme de ellos. ¿Cómo puedo hacer eso?

Sé que debe hacerse a través de las controlopciones de runit, pero al leer los documentos no me queda claro cómo se debe llamar el script de detención :(

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

ddinchev
fuente
Su servicio (no el script sino el programa) suena mal, debe cosechar / limpiar después de sus propios hijos. Solo curiosidad, ¿qué es?
Avery Payne

Respuestas:

13

De los documentos

Para cada carácter de control c enviado a la tubería de control, runv primero verifica si service / control / c existe y si es ejecutable. Si es así, inicia service / control / c y espera a que termine, antes de interpretar el comando. Si el programa sale con el código de retorno 0, runv se abstiene de enviar al servicio la señal correspondiente. El comando o siempre se considera como comando u. En el comando d, primero se verifica el servicio / control / t, y luego el servicio / control / d. En el comando x primero se marca service / control / t, y luego service / control / x. El control del servicio de registro opcional no se puede personalizar.

Eso significa que necesita crear un service_name/control/X, X es un ejecutable que se ejecutará cuando envíe el svcomando relacionado al servicio, como el dcomando (abajo). Si su script sale con el estado 0, no intentará desactivar el servicio en sí.

Básicamente, necesita un script ejecutable /etc/sv/<service>/control/dque haga lo que quiera y elimine el servicio, limpie los pids, etc.

volcado de memoria
fuente
Es realmente interesante y simple la forma en que funciona Dirvv.
Dzung Nguyen
2

La respuesta simple es nombrar su script de limpieza "servicio / finalización". Este script se ejecuta cuando sale "service / run".

También hay una interfaz "service / control / ctrl_char". Le permite realizar diferentes acciones según el comando que envíe a runsv.

Rik Schneider
fuente
1
El servicio / finalización se ejecuta después de que TERM CONT se envíe al servicio en ejecución. Es más como borrar el servicio después de matar.
MaximKostrikin
2

Tuve que resolver este problema yo mismo para Docker. Tenía el servidor uwsgi ejecutándose, y el docker (TERM en lugar de INT) me envió una señal incorrecta al detener el contenedor.

La idea de los archivos de control / x es reaccionar a una señal recibida. En mi caso, colocaría un tarchivo para la señal de terminación en control, ya que es el archivo reservado para el término señal. El script debe ser ejecutable.

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

El script envía una señal int al proceso uwsgi, que es lo que quiero.

Si el script de control sale sin error (código de retorno 0), la señal original no se enviará al proceso.

Entonces, en mi caso, pude recibir la señal de término y enviar una señal int al proceso de servicio.

itsafire
fuente