2009-04-19 10 views

risposta

81

Il modo più semplice è 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 dal processo padre.
  2. Diventa un leader di sessione (che stacca il programma dal terminale di controllo).
  3. Inoltra un altro processo figlio e chiude il primo figlio. Ciò impedisce il potenziale di acquisizione di un terminale di controllo.
  4. Modifica la directory di lavoro corrente su "/".
  5. Cancella la maschera di creazione del file.
  6. Chiude tutti i descrittori di file aperti.

L'integrazione con il sistema di runlevel è semplice. È necessario uno script simile al seguente (sostituire XXXXXXXXXXXX con il nome dello script Perl, YYYYYYYYYYYYYYYYYYY con una descrizione di ciò che fa e /path/to con percorso allo 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 spegnerlo o accenderlo 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 
+0

ho ottenuto il servizio X non supporta chkconfig. quando esegui un chkconfig -add X. qualche suggerimento? – Jirapong

+0

ah, mi dispiace essere colpa mia. refuso su #descrizione. grazie molto! – Jirapong

+0

Grandi feedback, grazie! –

7

Penso che il modo più semplice è quello di utilizzare daemon. Ti permette di eseguire qualsiasi processo come demone. Ciò significa che non devi preoccuparti delle librerie se, ad esempio, hai 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 per impostazione predefinita.

+0

È un'idea interessante, ma so che alcuni ambienti di produzione non hanno accesso al daemon binario. Personalmente vedrei questo più di una piattaforma di test/sviluppo piuttosto che qualcosa che useresti in un ambiente di produzione aziendale. Buone informazioni però - non ne avevo mai sentito parlare prima. (Modifica: non si rendeva conto che il thread aveva 5 anni, ma ancora IMO pertinente) –

36

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

Direi che è molto più semplice installare Proc :: Daemon piuttosto che disturbarlo manualmente, ma è sempre positivo che TMTOWTDI:) –

+0

In realtà quello funzionava meglio per me rispetto al precedente. Ho il controllo su ogni uscita in ingresso. Indovina che puoi trovarlo anche in Proc :: Daemon! –

+7

Upvoted per non richiedere un modulo non-core, che a volte conta. –

Problemi correlati