¿Cómo puedo ejecutar un script de Perl como daemon del sistema en Linux?

¿Cuál es una forma simple de ejecutar un script Perl como daemon en Linux?

Actualmente, esto está en CentOS. Quisiera que se iniciara con el sistema y se apagara con el sistema, así que alguna integración de /etc/rc.d/init.d también sería agradable, pero siempre podría agregar una línea personalizada a /etc/rc.d/rc.local .

La forma 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, usted podría hacer todas las cosas que Proc :: Daemon hace:

  1. Tenedor de un niño y sale del proceso principal.
  2. Conviértase en un líder de sesión (que separa el progtwig de la terminal de control).
  3. Bifurque otro proceso secundario y salga del 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 archivo.
  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 la ruta al script Perl) en /etc/init.d . Dado que está usando CentOS, una vez que tiene el script en /etc/init.d , puede usar chkconfig para apagarlo o encenderlo en los diferentes 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 

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 (STDERR, ">&STDOUT"); } 

Creo que la forma 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 usa:

 daemon myscript args 

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