Si vous n'avez pas Proc ::Daemon comme suggéré par Chas. Owens, voici comment procéder à la main :
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");
}
Je pense que le moyen le plus simple est d'utiliser daemon. Il vous permet d'exécuter n'importe quel processus en tant que démon. Cela signifie que vous n'avez pas à vous soucier des bibliothèques si, par exemple, vous décidez de passer à python. Pour l'utiliser, utilisez simplement :
daemon myscript args
Cela devrait être disponible sur la plupart des distributions, mais il se peut qu'il ne soit pas installé par défaut.
Le moyen le plus simple est d'utiliser 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
}
Vous pouvez également faire tout ce que fait Proc::Daemon :
- Dupliquez un enfant et quittez le processus parent.
- Devenir un chef de session (ce qui détache le programme du terminal de contrôle).
- Dupliquez un autre processus enfant et quittez le premier enfant. Cela empêche la possibilité d'acquérir un terminal de contrôle.
- Changer le répertoire de travail actuel en
"/"
. - Effacer le masque de création de fichier.
- Fermez tous les descripteurs de fichiers ouverts.
L'intégration avec le système de niveau d'exécution est facile. Vous avez besoin d'un script comme celui-ci (remplacez XXXXXXXXXXXX
avec le nom du script Perl, YYYYYYYYYYYYYYYYYYY
avec une description de ce qu'il fait, et /path/to
avec chemin vers le script Perl) dans /etc/init.d
. Puisque vous utilisez CentOS, une fois que vous avez le script dans /etc/init.d
, vous pouvez simplement utiliser chkconfig pour l'activer ou le désactiver dans les différents niveaux d'exécution.
#!/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