Wie kann ich einen Perl-Skript als System-Daemon in Linux?
Frage
Was ist eine einfache Möglichkeit, einen Perl-Skript auszuführen als Daemon in Linux zu bekommen?
Derzeit ist dies auf CentOS. Ich würde wollen, dass es mit dem System und Herunterfahren mit dem System zu starten, so dass einige /etc/rc.d/init.d
Integration wäre auch schön, aber ich konnte immer eine eigene Zeile in /etc/rc.d/rc.local
.
Lösung
Der einfachste Weg ist, um Proc :: Daemon verwenden .
#!/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önnen Sie all die Dinge tun, Proc :: Daemon tut:
- Gabel ein Kind und tritt aus dem übergeordneten Prozess.
- Werden Sie Gruppen-Führer (die das Programm von dem Steueranschluss ablöst).
- Gabel ein anderes Kind Prozess und Ausfahrt erstes Kind. Dies verhindert, dass das Potenzial, einen Steueranschluss des Erwerbs.
- Ändern Sie das aktuelle Arbeitsverzeichnis
"/"
. - Deaktivieren Sie die Dateierstellungsmaske.
- Schließen Sie alle geöffneten Dateibeschreibungen.
Die Integration mit dem Runlevel System ist einfach. Sie benötigen ein Skript wie folgt aus (ersetzen XXXXXXXXXXXX
mit dem Namen des Perl-Skript, YYYYYYYYYYYYYYYYYYY
mit einer Beschreibung dessen, was es tut, und /path/to
mit Pfad zum Perl-Skript) in /etc/init.d
. Da Sie CentOS verwenden, wenn Sie das Skript in /etc/init.d
haben, können Sie einfach chkconfig verwenden, um sie auszuschalten oder in den verschiedenen 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
Andere Tipps
Wenn Sie nicht über Proc: : Daemon von Chas vorgeschlagen, wie. Owens, hier ist, wie Sie es von Hand tun würde:
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, Daemon zu verwenden ist. Es ermöglicht Ihnen, jeden Prozess als Daemon laufen. Das heißt, Sie müssen nicht über Bibliotheken Sorge, wenn Sie zum Beispiel entschieden, Python zu ändern. Um es zu nutzen, verwenden Sie einfach:
daemon myscript args
Dies sollte auf den meisten Distributionen verfügbar sein, aber es könnte nicht standardmäßig installiert werden.