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.

War es hilfreich?

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:

  1. Gabel ein Kind und tritt aus dem übergeordneten Prozess.
  2. Werden Sie Gruppen-Führer (die das Programm von dem Steueranschluss ablöst).
  3. Gabel ein anderes Kind Prozess und Ausfahrt erstes Kind. Dies verhindert, dass das Potenzial, einen Steueranschluss des Erwerbs.
  4. Ändern Sie das aktuelle Arbeitsverzeichnis "/".
  5. Deaktivieren Sie die Dateierstellungsmaske.
  6. 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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top