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");
}
Creo que la forma más fácil es usar daemon. Le permite ejecutar cualquier proceso como un demonio. Esto significa que no tiene que preocuparse por las bibliotecas si, por ejemplo, decide 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 forma predeterminada.
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, podrías hacer todas las cosas que hace Proc::Daemon:
- Bifurca a un niño y sale del proceso principal.
- Conviértete en un líder de sesión (lo que separa el programa del terminal de control).
- Bifurque otro proceso secundario y salga del primero secundario. Esto evita la posibilidad de adquirir un terminal de control.
- Cambiar el directorio de trabajo actual a
"/"
. - Borrar la máscara de creación de archivos.
- Cerrar 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