¿Cuál es la diferencia entre start-stop-daemon y ejecutar con &?


18

Estoy configurando un servicio en /etc/init.d. Estoy viendo varios scripts allí, algunos se implementan con start-stop-daemon ...y otros con /path/to/script &.

Todos guardan el pid en un archivo y hacen algunas comprobaciones.

¿Cuál es la mejor práctica, cuáles son las diferencias, qué es importante saber aquí ...? (en general)

En mi caso particular, tengo un servidor http localhost ligero y simple en Java al que una aplicación llamará una vez cada hora más o menos y solo da un estúpido número aleatorio (no hay más detalles aquí, solo quiero decir que no usa el sistema de archivos o hilos o cualquier cosa complicada en caso de que esto sea importante en mi pregunta)

Gracias

Respuestas:


27

Un trabajo en segundo plano (es decir, iniciado con &) todavía tiene sus stdin, stdout y stderr conectados al terminal en el que se inició. Puede escribir repentinamente (por ejemplo, mensajes de error) en el terminal ("perturbando" el trabajo en el primer plano) o pausa esperando la entrada del teclado (primero debes ponerlo en primer plano). Por supuesto, puede redirigir stdout y stderr a un archivo o / dev / null para evitar que el trabajo en segundo plano se escriba en el terminal.

Un trabajo de fondo también se puede poner en primer plano, por ejemplo. el trabajo en primer plano actual se detiene y el fgcomando (primer plano) se utiliza para poner un trabajo en segundo plano en primer plano. También se puede llegar a un trabajo en segundo plano mediante señales del terminal, por ejemplo. SIGHUP cuando cierra el terminal, que generalmente finaliza (la mayoría) de los programas iniciados en el terminal.

Un demonio, como los que se inician automáticamente por init.d, pero que también pueden iniciarse manualmente desde un terminal, por otro lado, se ejecuta desconectado de cualquier terminal. Incluso si se inició manualmente desde un terminal, un demonio se desconectará del terminal, por lo que no puede escribirlo (stdout, stderr) ni leerlo (stdin). También es "inmune" a las señales enviadas "automáticamente" por el terminal. (aunque puede enviarle señales usando kill -signal pid).

"Fondo" y "primer plano" se refieren al estado del proceso en algún terminal, ya sea que el proceso controle el terminal actualmente o no. Como los demonios no están conectados a un terminal (pero se han desconectado de él de todas las maneras), no se puede decir que se esté ejecutando en segundo plano. Los demonios son procesos que se ejecutan sin estar asociados con un terminal, ni en primer plano ni en segundo plano.

Si usa pslas opciones que muestran qué terminal usa un proceso, verá que tanto los trabajos anteriores como los de fondo están asociados con un terminal (por ejemplo, tty2). Los demonios, por otro lado, tienen un "?" en este campo.

Los demonios generalmente se comportan como tales, incluso si se inician manualmente. Crear un demonio propio es bastante trabajo: hay algunos trucos involucrados para desconectarlo por completo de la terminal. Debe crear su propio usuario / grupo para ejecutarlo. Por lo general, debe usar / tmp, / var / tmp o / var / run si desea que cree archivos; por lo general, no debería tener derechos en ningún otro lugar. Como no puede informar errores a un terminal, debe hacer que escriba en un archivo de registro (por ejemplo, es su propio archivo de registro en / var / log). Los demonios deberían hacer una entrada en / var / run con su PID actual, y deberían verificar si ya se estaba ejecutando otra instancia. Debe respetar los bloqueos (/ var / lock) para archivos o dispositivos cuando corresponda. Debería responder a SIGHUP recargando sus archivos de configuración y usar configuraciones actualizadas.

Otro punto es cómo funcionan la mayoría de los demonios. Un demonio es generalmente un ejecutable único que puede ejecutarse en uno de dos modos distintos; dependiendo de si es el demonio original, el padre, comenzó en el arranque o manualmente ... o un niño engendrado por este padre. El proceso principal generalmente solo se sienta y espera algún evento: un tiempo específico, el tiempo transcurrido, un intento de conectarse a un puerto de red específico o lo que sea. Cuando esto sucede, el padre crea un proceso hijo idéntico a sí mismo (usando la llamada al sistema fork ()) e inmediatamente vuelve a esperar otro evento (y tal vez engendrando más hijos). Es el proceso hijo el que realmente hará el trabajo, como sincronizar un disco, ejecutar un comando (por ejemplo cron) o establecer una conexión de red (por ejemplo, sshdoftpd) La única diferencia entre el padre y el hijo es que obtuvieron diferentes PID y que el PPID (Parent-PID) del hijo es el PID del proceso padre; esto puede usarse para determinar si el proceso es el padre o el hijo. Por lo tanto, el mismo proceso debe poder funcionar en dos modos: como el padre que espera (y engendra) o como un niño que trabaja.

Si bien no es difícil escribir un demonio, tampoco es trivial: como ve, hay bastantes "trucos" que debe saber primero. En general, creo que escribir un demonio requeriría mucho esfuerzo para obtener muy poca ganancia en comparación con otras alternativas:

Usar nohupo disownen un trabajo en segundo plano suele ser una alternativa suficientemente buena, ya que mantiene vivo el proceso incluso si el terminal se cierra. Sin embargo, a menudo es una buena idea redirigir stdout y stderr a un archivo o / dev / null. Para programas más interactivos, screenes una buena manera de guardar algo "lejos" hasta que lo necesite. at, batchy crontabtambién vale la pena considerar.


1
También recuerdo de mis antiguos cursos del sistema Unix, que cuando se inicia desde una terminal, el servidor también debe abandonar su [grupo de proceso] [ en.wikipedia.org/wiki/Process_group] . Hasta donde recuerdo. Para que el proceso sea inmune a cualquier señal de su terminal original.
yves Baumes
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.