GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo puedo ejecutar un script de Perl como un demonio del sistema en Linux?

Si no tiene Proc::Daemon como lo sugiere Chas. Owens, así es como lo harías 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");
 }

Creo que la forma más fácil es usar daemon. Le permite ejecutar cualquier proceso como un demonio. Esto significa que no tiene que preocuparse por las bibliotecas si, por ejemplo, decide cambiar a Python. Para usarlo, solo usa:

daemon myscript args

Esto debería estar disponible en la mayoría de las distribuciones, pero es posible que no esté instalado de forma predeterminada.


La forma más fácil es usar 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
}

Alternativamente, podrías hacer todas las cosas que hace Proc::Daemon:

  1. Bifurca a un niño y sale del proceso principal.
  2. Conviértete en un líder de sesión (lo que separa el programa del terminal de control).
  3. Bifurque otro proceso secundario y salga del primero secundario. Esto evita la posibilidad de adquirir un terminal de control.
  4. Cambiar el directorio de trabajo actual a "/" .
  5. Borrar la máscara de creación de archivos.
  6. Cerrar todos los descriptores de archivos abiertos.

La integración con el sistema de nivel de ejecución es fácil. Necesita un script como el siguiente (reemplace XXXXXXXXXXXX con el nombre del script Perl, YYYYYYYYYYYYYYYYYYY con una descripción de lo que hace, y /path/to con ruta al script Perl) en /etc/init.d . Como está utilizando CentOS, una vez que tenga el script en /etc/init.d , puede usar chkconfig para apagarlo o encenderlo en los distintos niveles de ejecución.

#!/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. Cómo configurar el script de inicio y apagado en Gentoo Linux

  2. Cómo hacer que un script de Python se ejecute como un servicio o demonio en Linux

  3. ¿Cómo ejecutar un script en segundo plano (linux openwrt)?

  4. ¿Cómo ejecutar sbt como demonio?

  5. ¿Cómo puedo responder automáticamente a las indicaciones en un script Bash de Linux?

Cómo hacer que el sistema Linux funcione más rápido en CPU Intel

Cómo ejecutar Windows 95 en Linux

Cómo ejecutar Shell Script como servicio SystemD en Linux

Cómo ejecutar un script Bash

Linux:¿cómo ejecutar un script activado por una entrada de joystick?

Cómo ejecutar paquetes .run y .bin en el sistema Linux