Cuando inicia el servicio manualmente desde la línea de comandos (sin usar el nohup
comando de prefijo o el &
sufijo para ejecutarlo en segundo plano, o en otras palabras, simplemente ejecute el comando que pondría en la ExecStart=
línea del .service
archivo), ¿qué sucede?
a) Si el servicio se inicia y sigue ejecutándose, y el mensaje no vuelve hasta que presiona Control-C o detiene el servicio de alguna otra manera: entonces Type = simple
es la opción correcta.
b) Si la solicitud regresa pero el servicio sigue ejecutándose en segundo plano (es decir, el servicio se demoniza solo), entonces Type = forking
es la opción correcta.
c) Si el servicio hace su trabajo y regresa al indicador sin dejar nada en ejecución (es decir, el servicio solo ajusta algunas configuraciones del kernel, envía un comando a otra cosa o hace algo similar), entonces Type = oneshot
probablemente sea la opción correcta. En este caso, ExecStart
el servicio podría ser el comando para "configurar" algo, y ExecStop
sería el comando correspondiente para "desarmarlo". Por lo general, este tipo se beneficia RemainAfterExit=true
, por lo que systemd realizará un seguimiento del "estado" de este servicio de acuerdo a si la cosa se "configuró" o "desarmó" más recientemente.
Los otros Type
valores son casos especiales. Por ejemplo, si el servicio utiliza una conexión D-Bus, entonces Type = dbus
podría ser la mejor opción. Se da systemd
cuenta del hecho, y luego systemd rastreará este servicio (y todo lo que dependa de él) por la presencia de este servicio en el D-Bus.
Para usarlo Type = notify
, el proceso debe poder conectarse al socket Unix especificado en la variable de entorno $NOTIFY_SOCKET
e informar su estado escribiendo mensajes en ese socket cuando sea necesario. Además, el archivo de servicio debe especificar la NotifyAccess
opción para otorgar acceso al socket de notificación según corresponda.
Hay una utilidad de línea de comandos systemd-notify
y una función de biblioteca C sd_notify(3)
que puede usar para enviar estos mensajes, pero si ninguno de ellos es adecuado para sus requisitos, puede implementar su propio remitente de mensajes. Los mensajes requeridos son muy simples y parecen asignaciones de variables de shell: por ejemplo, para notificar que el servicio ha completado con éxito el inicio y está listo para atender cualquier solicitud entrante, el servicio debe enviar la cadena equivalente a la salida del printf "READY=1\n"
socket. Consulte man 3 sd_notify
para obtener más detalles sobre los mensajes reconocidos.
Nota: muchas aplicaciones de servicio diseñadas para ser portátiles en muchos sistemas de estilo Unix pueden comportarse como b) de forma predeterminada, pero se puede hacer que funcionen como a) agregando una opción (generalmente descrita como "no bifurcar", "seguir ejecutándose" en primer plano "," no demonizar "o similar). En ese caso, si la opción no tiene otros efectos secundarios, sería preferible agregar la opción y usar el comportamiento tipo a) systemd
.
apache
, ¿qué tipo debería usarse?apachectl start
como root, tal vez? Intenta hacerlo y mira qué sucede. Luego elija a), b) o c) de mi respuesta. Apuesto a que el aviso regresa y Apache sigue ejecutándose, por lo que b) sería la respuesta.Type=notify
?Type=notify
agregado.