Domanda

Che cosa è un modo semplice per ottenere uno script in Perl per l'esecuzione come un demone in linux?

Al momento, questo è su CentOS. Vorrei che venga avviato con il sistema e l'arresto con il sistema, in modo un po 'integrazione /etc/rc.d/init.d Sarebbe anche bello, ma potrei sempre aggiungere una linea personalizzata per /etc/rc.d/rc.local.

È stato utile?

Soluzione

Il modo più semplice è quello di utilizzare 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 si potrebbe fare tutte le cose Proc :: Daemon fa:

  1. Forcella un bambino ed esce il processo padre.
  2. Diventa leader di sessione (che stacca il programma dal terminale di controllo).
  3. Fork un altro processo figlio e uscire primo figlio. Ciò impedisce il potenziale di acquisizione di un terminale di controllo.
  4. Cambiare la directory di lavoro corrente "/".
  5. Cancella la maschera di creazione del file.
  6. Chiudere tutti i descrittori di file aperti.

L'integrazione con il sistema di runlevel è facile. Avete bisogno di uno script come il seguente (sostituire XXXXXXXXXXXX con il nome dello script Perl, YYYYYYYYYYYYYYYYYYY con una descrizione di ciò che fa, e /path/to con percorso dello script Perl) in /etc/init.d. Dal momento che si sta utilizzando CentOS, una volta che hai lo script in /etc/init.d, si può semplicemente utilizzare chkconfig per disattivarlo o 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

Altri suggerimenti

Se non si dispone di Proc: : Daemon come suggerito da Chas. Owens, ecco come si farebbe 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");
 }

Credo che il modo più semplice è quello di utilizzare daemon . Esso consente di eseguire qualsiasi processo come demone. Questo significa che non devi preoccuparti di librerie se, per esempio, ha deciso di passare a python. Per usarlo, basta usare:

daemon myscript args

Questo dovrebbe essere disponibile sulla maggior parte delle distribuzioni, ma potrebbe non essere installato di default.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top