GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie kann ich ein Perl-Skript als System-Daemon unter Linux ausführen?

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:

  1. Verzweigen Sie ein untergeordnetes Element und verlassen Sie den übergeordneten Prozess.
  2. Session Leader werden (was das Programm vom steuernden Terminal trennt).
  3. Verzweigen Sie einen weiteren untergeordneten Prozess und beenden Sie das erste untergeordnete Verfahren. Dies verhindert die Möglichkeit, ein steuerndes Terminal zu erwerben.
  4. Ändern Sie das aktuelle Arbeitsverzeichnis zu "/" .
  5. Löschen Sie die Dateierstellungsmaske.
  6. 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

Linux
  1. So richten Sie das Start- und Herunterfahrskript unter Gentoo Linux ein

  2. Wie führe ich Linux-Bash-Befehle in einem PERL-Skript aus?

  3. Wie kann ich eine Funktion von einem Skript in der Befehlszeile ausführen?

  4. Wie führe ich sbt als Daemon aus?

  5. Wie kann ich automatisch auf Eingabeaufforderungen in einem Linux-Bash-Skript reagieren?

So machen Sie ein Linux-System schneller auf Intel-CPUs

So führen Sie Windows 95 unter Linux aus

So führen Sie Shell-Skript als SystemD-Dienst in Linux aus

So führen Sie ein Bash-Skript aus

Linux – Wie führen Sie ein Skript aus, das durch eine Joystick-Eingabe ausgelöst wird?

So führen Sie .run- und .bin-Pakete im Linux-System aus