Se non hai Proc::Daemon come suggerito da Chas. Owens, ecco come lo faresti 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");
}
Penso che il modo più semplice sia usare il demone. Ti consente di eseguire qualsiasi processo come demone. Ciò significa che non devi preoccuparti delle librerie se, ad esempio, decidi di passare a Python. Per usarlo, basta usare:
daemon myscript args
Dovrebbe essere disponibile sulla maggior parte delle distribuzioni, ma potrebbe non essere installato per impostazione predefinita.
Il modo più semplice è usare 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
}
In alternativa puoi fare tutte le cose che fa Proc::Daemon:
- Esegui il fork di un figlio ed esce dal processo genitore.
- Diventa un leader di sessione (che stacca il programma dal terminale di controllo).
- Esegui il fork di un altro processo figlio ed esci dal primo figlio. Ciò impedisce la possibilità di acquisire un terminale di controllo.
- Cambia la directory di lavoro corrente in
"/"
. - Cancella la maschera di creazione del file.
- Chiudi tutti i descrittori di file aperti.
L'integrazione con il sistema runlevel è semplice. Hai bisogno di uno script come il seguente (sostituisci XXXXXXXXXXXX
con il nome dello script Perl, YYYYYYYYYYYYYYYYYYY
con una descrizione di cosa fa, e /path/to
con il percorso dello script Perl) in /etc/init.d
. Dato che stai usando CentOS, una volta che hai lo script in /etc/init.d
, puoi semplicemente usare chkconfig per attivarlo o disattivarlo nei vari runlevel.
#!/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