Wenn Sie Proc::Daemon nicht haben, wie von Chas vorgeschlagen. Owens, so würden Sie es von Hand machen:
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");
}
Ich denke, der einfachste Weg ist die Verwendung von Daemon. Es ermöglicht Ihnen, jeden Prozess als Daemon auszuführen. Das bedeutet, dass Sie sich keine Sorgen um Bibliotheken machen müssen, wenn Sie sich beispielsweise für den Wechsel zu Python entschieden haben. Um es zu verwenden, verwenden Sie einfach:
daemon myscript args
Dies sollte in den meisten Distributionen verfügbar sein, wird aber möglicherweise nicht standardmäßig installiert.
Der einfachste Weg ist die Verwendung von 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
}
Alternativ könnten Sie all die Dinge tun, die Proc::Daemon tut:
- Verzweigen Sie ein untergeordnetes Element und verlassen Sie den übergeordneten Prozess.
- Session Leader werden (was das Programm vom steuernden Terminal trennt).
- Verzweigen Sie einen weiteren untergeordneten Prozess und beenden Sie das erste untergeordnete Verfahren. Dies verhindert die Möglichkeit, ein steuerndes Terminal zu erwerben.
- Ändern Sie das aktuelle Arbeitsverzeichnis zu
"/"
. - Löschen Sie die Dateierstellungsmaske.
- Schließen Sie alle geöffneten Dateideskriptoren.
Die Integration mit dem Runlevel-System ist einfach. Sie benötigen ein Skript wie das folgende (ersetzen Sie XXXXXXXXXXXX
mit dem Namen des Perl-Skripts, YYYYYYYYYYYYYYYYYYY
mit einer Beschreibung dessen, was es tut, und /path/to
mit Pfad zum Perl-Skript) in /etc/init.d
. Da Sie CentOS verwenden, haben Sie das Skript einmal in /etc/init.d
, Sie können es einfach mit chkconfig in den verschiedenen Runlevels ein- oder ausschalten.
#!/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