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 control
opciones de runit, pero al leer los documentos no me queda claro cómo se debe llamar el script de detención :(
Respuestas:
De los documentos
Eso significa que necesita crear un
service_name/control/X
, X es un ejecutable que se ejecutará cuando envíe elsv
comando relacionado al servicio, como eld
comando (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/d
que haga lo que quiera y elimine el servicio, limpie los pids, etc.fuente
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.
fuente
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
t
archivo 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.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.
fuente