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:
- Tenedor un niño y sale del proceso padre.
- Conviértase en un líder de sesión (que separa el programa de la terminal de control).
- Horquilla otro proceso secundario y salga el primer hijo. Esto evita el potencial de adquirir un terminal de control.
- Cambie el directorio de trabajo actual a
"/"
.
- Borre la máscara de creación de archivos.
- 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
Tengo el servicio X no es compatible con chkconfig. cuando ejecute un chkconfig -add X. ¿alguna sugerencia? – Jirapong
ah, lo siento ser culpa mía. typo en #descripción. ¡muchas gracias! – Jirapong
¡Gran retroalimentación, muchas gracias! –