3 votos

¿Hay alguna manera de evitar que SIGKILL después de SIGTERM para un demonio \agent durante el apagado \restart ?

Tengo un demonio que debe ser terminado con gracia. Debe tener un tiempo de espera antes de que el sistema envíe a SIGKILL y lo mate.

¿Existe la posibilidad de hacer tal cosa en MAC?

3voto

yoliho Puntos 340

No - este no es el idioma de decisión en MacOS, así que sus requisitos de desarrollo están en conflicto con la intención del diseño del sistema.

Tu demonio debería ocuparse de esto y el tiempo y las formas técnicas para hacerlo están incorporadas en MacOS así como documentadas bastante bien por Apple.

MacOS no apaga los demonios con sólo enviar un SIGKILL primero envía un SIGTERM y luego sólo si el proceso todavía está ahí un SIGKILL. Tienes algún control para retrasar esto usando el método disableSuddenTermination en NSProcessInfo ver https://developer.apple.com/documentation/foundation/nsprocessinfo/1412841-disablesuddentermination?language=objc

Así que su demonio debería cerrarse al recibir una señal y así la señal no tendrá ningún efecto.

Esto fue documentado en el libro de Apple El ciclo de vida de un demonio

También es la forma normal de apagar BSD y Linux, excepto que el lanzamiento no está involucrado.

2voto

Jose Chavez Puntos 645

Sí, esto es definitivamente posible.

Si inicia el servicio correctamente a través de launchd, puede definir la cantidad de tiempo que necesita para detener el servicio con la tecla "ExitTimeOut" en la lista de lanzamiento de su servicio. Si pones "ExitTimeOut" por ejemplo 300, esto significa que tu servicio tiene 300 segundos (5 minutos) para hacer algo entre la recepción del SIGTERM y el hecho de ser matado por la recepción de la señal SIGKILL.

Otra posibilidad es redefinir la secuencia de apagado como tal. Esta es una solución más "hacky", pero si está pensada sólo para tu propio Mac, podría ser la más fácil.

Una forma de hacerlo es simplemente reemplazar el /sbin/shutdown con un programa de su propio gusto. Una idea es mover el programa original /sbin/shutdown a, por ejemplo, /sbin/shutdown.apple y luego agregar una simple shell-script en su lugar.

La cáscara script debería verse algo así:

#!/bin/bash
notify_my_program
sleep 300
exec /sbin/shutdown.apple "$@"

El "notify_my_program" debe ser reemplazado por algo que le diga a su servicio que se apague. Podría ser tan simple como enviarle la señal SIGTERM.

Por favor, asegúrate de que tienes los permisos adecuados en el shell script (es decir, los mismos que el programa de cierre original).

Después de la modificación arriba mencionada, su sistema debería en el momento del apagado notificar primero a su servicio para que se apague, esperar 5 minutos y luego hacer lo que normalmente hace en el momento del apagado.

El proceso de apagado modificado debe ser usado cuando se apaga desde la línea de comandos, así como cuando se hace desde la GUI (es decir, desde el menú de Apple).

Por último, una solución más compleja sería reemplazar el lanzamiento con su propio sistema de inicio personalizado. La forma más simple de hacerlo sería descargar el código fuente de launchd, cambiar la secuencia de apagado, recompilar y reemplazar launchd en su sistema. El programa /sbin/shutdown funciona simplemente enviando una señal a launchd (varias señales para reiniciar, detener, apagar, etc.) - así que la secuencia de apagado real para la parte del sistema que corresponde al espacio de usuario es manejada realmente por launchd, así que de esta manera, puedes personalizarlo para hacer lo que quieras.

Tenga en cuenta que cambiar la secuencia de apagado en cualquiera de las dos formas mencionadas requiere que desactive la SIP (Protección de la Integridad del Sistema) antes de proceder.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X