¿Cómo puedo ejecutar un script de Perl como daemon del sistema en Linux?
ejecutar perl en linux (3)
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.
¿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:
- Tenedor de un niño y sale del proceso principal.
- Conviértase en un líder de sesión (que separa el programa de la terminal de control).
- Bifurque otro proceso secundario y salga del 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 archivo.
- 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 (STDOUT, ">/dev/null");
open (STDERR, ">&STDOUT");
}