GNU/Linux >> Linux Esercitazione >  >> Linux

Come posso eseguire uno script Perl come demone di sistema in Linux?

Se non hai Proc::Daemon come suggerito da Chas. Owens, ecco come lo faresti 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");
 }

Penso che il modo più semplice sia usare il demone. Ti consente di eseguire qualsiasi processo come demone. Ciò significa che non devi preoccuparti delle librerie se, ad esempio, decidi di passare a Python. Per usarlo, basta usare:

daemon myscript args

Dovrebbe essere disponibile sulla maggior parte delle distribuzioni, ma potrebbe non essere installato per impostazione predefinita.


Il modo più semplice è usare 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 puoi fare tutte le cose che fa Proc::Daemon:

  1. Esegui il fork di un figlio ed esce dal processo genitore.
  2. Diventa un leader di sessione (che stacca il programma dal terminale di controllo).
  3. Esegui il fork di un altro processo figlio ed esci dal primo figlio. Ciò impedisce la possibilità di acquisire un terminale di controllo.
  4. Cambia la directory di lavoro corrente in "/" .
  5. Cancella la maschera di creazione del file.
  6. Chiudi tutti i descrittori di file aperti.

L'integrazione con il sistema runlevel è semplice. Hai bisogno di uno script come il seguente (sostituisci XXXXXXXXXXXX con il nome dello script Perl, YYYYYYYYYYYYYYYYYYY con una descrizione di cosa fa, e /path/to con il percorso dello script Perl) in /etc/init.d . Dato che stai usando CentOS, una volta che hai lo script in /etc/init.d , puoi semplicemente usare chkconfig per attivarlo o disattivarlo 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

Linux
  1. Come impostare lo script di avvio e arresto su Gentoo Linux

  2. Come posso eseguire una funzione da uno script nella riga di comando?

  3. Come eseguire lo script Python come servizio?

  4. Come eseguire sbt come demone?

  5. Come posso scoprire se un sistema Linux utilizza Wayland o X11?

Come rendere il sistema Linux più veloce su CPU Intel

Come eseguire Windows 95 su Linux

Come eseguire lo script della shell come servizio SystemD in Linux

Come eseguire uno script Bash

Linux:come eseguire uno script attivato da un input del joystick?

Come eseguire i pacchetti .run e .bin nel sistema Linux