2009-04-19 18 views

Respuesta

81

La manera más fácil es usar Proc::Daemon.

#!/usr/bin/perl 

use strict; 
use warnings; 
use Proc::Daemon; 

Proc::Daemon::Init; 

my $continue = 1; 
$SIG{TERM} = sub { $continue = 0 }; 

while ($continue) { 
    #do stuff 
} 

Alternativamente se podría hacer todas las cosas Proc :: daemon:

  1. Tenedor un niño y sale del proceso padre.
  2. Conviértase en un líder de sesión (que separa el programa de la terminal de control).
  3. Horquilla otro proceso secundario y salga el primer hijo. Esto evita el potencial de adquirir un terminal de control.
  4. Cambie el directorio de trabajo actual a "/".
  5. Borre la máscara de creación de archivos.
  6. Cierre todos los descriptores de archivos abiertos.

La integración con el sistema de nivel de ejecución es fácil. Necesita un script como el siguiente (reemplace XXXXXXXXXXXX con el nombre del script Perl, YYYYYYYYYYYYYYYYYYY con una descripción de lo que hace, y /path/to con ruta al script Perl) en /etc/init.d. Como está utilizando CentOS, una vez que tenga el script en /etc/init.d, puede usar chkconfig para apagarlo o encenderlo en los distintos niveles de ejecución.

#!/bin/bash 
# 
# XXXXXXXXXXXX This starts and stops XXXXXXXXXXXX 
# 
# chkconfig: 2345 12 88 
# description: XXXXXXXXXXXX is YYYYYYYYYYYYYYYYYYY 
# processname: XXXXXXXXXXXX 
# pidfile: /var/run/XXXXXXXXXXXX.pid 
### BEGIN INIT INFO 
# Provides: $XXXXXXXXXXXX 
### END INIT INFO 

# Source function library. 
. /etc/init.d/functions 

binary="/path/to/XXXXXXXXXXXX" 

[ -x $binary ] || exit 0 

RETVAL=0 

start() { 
    echo -n "Starting XXXXXXXXXXXX: " 
    daemon $binary 
    RETVAL=$? 
    PID=$! 
    echo 
    [ $RETVAL -eq 0 ] && touch /var/lock/subsys/XXXXXXXXXXXX 

    echo $PID > /var/run/XXXXXXXXXXXX.pid 
} 

stop() { 
    echo -n "Shutting down XXXXXXXXXXXX: " 
    killproc XXXXXXXXXXXX 
    RETVAL=$? 
    echo 
    if [ $RETVAL -eq 0 ]; then 
     rm -f /var/lock/subsys/XXXXXXXXXXXX 
     rm -f /var/run/XXXXXXXXXXXX.pid 
    fi 
} 

restart() { 
    echo -n "Restarting XXXXXXXXXXXX: " 
    stop 
    sleep 2 
    start 
} 

case "$1" in 
    start) 
     start 
    ;; 
    stop) 
     stop 
    ;; 
    status) 
     status XXXXXXXXXXXX 
    ;; 
    restart) 
     restart 
    ;; 
    *) 
     echo "Usage: $0 {start|stop|status|restart}" 
    ;; 
esac 

exit 0 
+0

Tengo el servicio X no es compatible con chkconfig. cuando ejecute un chkconfig -add X. ¿alguna sugerencia? – Jirapong

+0

ah, lo siento ser culpa mía. typo en #descripción. ¡muchas gracias! – Jirapong

+0

¡Gran retroalimentación, muchas gracias! –

7

Creo que la manera más fácil es usar daemon. Le permite ejecutar cualquier proceso como daemon. Esto significa que no tiene que preocuparse por las bibliotecas si, por ejemplo, decidió cambiar a Python. Para usarlo, solo use:

daemon myscript args 

Esto debería estar disponible en la mayoría de las distribuciones, pero es posible que no esté instalado por defecto.

+0

Es una idea genial, pero sé que algunos entornos de producción no tienen acceso al binario daemon. Personalmente, vería esto más como una plataforma de prueba/desarrollo que para algo que utilizarías en un entorno de producción empresarial. Buena información, no había oído hablar de ella antes. (Editar: no se dio cuenta de que el hilo tenía 5 años, pero sigue siendo pertinente IMO) –

36

Si no tiene Proc::Daemon como lo sugiere Chas. Owens, así es como lo harías a mano:

sub daemonize { 
    use POSIX; 
    POSIX::setsid or die "setsid: $!"; 
    my $pid = fork() // die $!; #// 
    exit(0) if $pid; 

    chdir "/"; 
    umask 0; 
    for (0 .. (POSIX::sysconf (&POSIX::_SC_OPEN_MAX) || 1024)) 
     { POSIX::close $_ } 
    open (STDIN, "</dev/null"); 
    open (STDOUT, ">/dev/null"); 
    open (STDERR, ">&STDOUT"); 
} 
+1

Yo diría que es mucho más fácil instalar Proc :: Daemon que molestarse en enrollarlo a mano, pero siempre es bueno que TMTOWTDI:) –

+0

En realidad, ese funcionó mejor para mí que el anterior. Tengo control sobre cada salida de entrada. ¡Adivina que también puedes encontrarlo en Proc :: Daemon! –

+7

Upvoted para no requerir un módulo no principal, que a veces importa. –

Cuestiones relacionadas