GNU/Linux >> Tutoriels Linux >  >> Linux

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

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

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");
 }

Je pense que le moyen le plus simple est d'utiliser daemon. 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, par exemple, vous décidez de passer à python. Pour l'utiliser, utilisez simplement :

daemon myscript args

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


Le moyen 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
}

Vous pouvez également faire tout ce que fait Proc::Daemon :

  1. Dupliquez un enfant et quittez le processus parent.
  2. Devenir un chef de session (ce qui détache le programme du terminal de contrôle).
  3. Dupliquez un autre processus enfant et quittez le premier enfant. Cela empêche la possibilité d'acquérir un terminal de contrôle.
  4. Changer le répertoire de travail actuel en "/" .
  5. Effacer le masque de création de fichier.
  6. Fermez tous les descripteurs de fichiers ouverts.

L'intégration avec le système de niveau d'exécution est facile. Vous avez besoin d'un script comme celui-ci (remplacez XXXXXXXXXXXX avec le nom du script Perl, YYYYYYYYYYYYYYYYYYY avec une description de ce qu'il fait, et /path/to avec chemin vers le script Perl) dans /etc/init.d . Puisque vous utilisez CentOS, une fois que vous avez le script dans /etc/init.d , vous pouvez simplement utiliser chkconfig pour l'activer ou le 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

Linux
  1. Linux - Comment exécuter un script sur le verrouillage/déverrouillage de l'écran ?

  2. Comment puis-je exécuter une fonction à partir d'un script en ligne de commande ?

  3. Comment faire fonctionner le script Python en tant que service ?

  4. Comment exécuter sbt en tant que démon?

  5. Comment puis-je répondre automatiquement aux invites d'un script Linux Bash ?

Comment rendre le système Linux plus rapide sur les processeurs Intel

Comment exécuter Windows 95 sous Linux

Comment exécuter un script Shell en tant que service SystemD sous Linux

Comment exécuter un script bash

Linux - Comment exécuter un script déclenché par une entrée de joystick ?

Comment exécuter les packages .run et .bin dans le système Linux