59 votes

Comment puis-je exécuter un script Perl en tant que démon système sous Linux?

Qu'est-ce qu'un moyen simple d'obtenir un script Perl à exécuter en tant que démon sous Linux?

Actuellement, c'est sur CentOS. Je voudrais que le système démarre et s’arrête avec le système. Ainsi, une certaine intégration /etc/rc.d/init.d serait également intéressante, mais je pourrais toujours ajouter une ligne personnalisée à /etc/rc.d/rc.local .

86voto

Chas. Owens Points 40887

Le plus simple est d'utiliser 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
}

Alternativement, vous pourriez faire toutes les choses Proc::Daemon n':

  1. La fourche d'un enfant et les sorties du processus parent.
  2. Devenir un leader de session (qui se détache le programme à partir du terminal de contrôle).
  3. Fourche à un autre enfant de processus et de sortie du premier enfant. Cela empêche le potentiel de l'acquisition d'un terminal de contrôle.
  4. Changer le répertoire de travail en cours d' "/".
  5. Effacer le fichier de création de masque.
  6. Fermer tous les descripteurs de fichiers ouverts.

L'intégration avec le niveau d'exécution du système est facile. Vous avez besoin d'un script comme la suivante (remplacer XXXXXXXXXXXX avec le script Perl nom, YYYYYYYYYYYYYYYYYYY avec une description de ce qu'il fait, et /path/to avec chemin d'accès au script Perl) en /etc/init.d. Puisque vous êtes à l'aide de CentOS, une fois que vous avez le script en /etc/init.d, vous pouvez simplement utiliser chkconfig pour l'activer ou de désactiver dans les différents niveaux d'exécution.

#!/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

44voto

Bklyn Points 1738

Si vous n'avez pas Proc :: Daemon comme suggéré par Chas. Owens, voici comment vous le feriez à la main:

 sub daemonize {
   use POSIX;
   POSIX::setsid or die "setsid: $!";
   my $pid = fork ();
   if ($pid < 0) {
      die "fork: $!";
   } elsif ($pid) {
      exit 0;
   }
   chdir "/";
   umask 0;
   foreach (0 .. (POSIX::sysconf (&POSIX::_SC_OPEN_MAX) || 1024))
      { POSIX::close $_ }
   open (STDIN, "</dev/null");
   open (STDOUT, ">/dev/null");
   open (STDERR, ">&STDOUT");
 }
 

7voto

Zifre Points 14109

Je pense que le moyen le plus simple est d'utiliser un démon . Il vous permet d'exécuter n'importe quel processus en tant que démon. Cela signifie que vous n'avez pas à vous soucier des bibliothèques si vous avez, par exemple, décidé de passer à python. Pour l'utiliser, il suffit d'utiliser:

 daemon myscript args
 

Cela devrait être disponible sur la plupart des distributions, mais il se peut que ce ne soit pas installé par défaut.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X