2009-04-19 12 views

Odpowiedz

81

Najprostszym sposobem jest użycie 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 
} 

Alternatywnie można zrobić wszystkie rzeczy, Proc :: Daemon robi:

  1. Fork dziecko i wyjście z procesu nadrzędnego.
  2. Zostań liderem sesji (który odłącza program od terminala kontrolującego).
  3. Rozwidź kolejny proces potomny i zakończ pierwsze dziecko. Zapobiega to możliwości nabycia terminala sterującego.
  4. Zmień bieżący katalog roboczy na "/".
  5. Wyczyść maskę tworzenia pliku.
  6. Zamknij wszystkie otwarte deskryptory plików.

Integracja z systemem poziomów uruchamiania jest łatwa. Potrzebujesz skryptu podobnego do następującego (zastąp XXXXXXXXXXXX nazwą skryptu Perla, YYYYYYYYYYYYYYYYYYY z opisem tego, co robi, i /path/to ze ścieżką do skryptu Perla) w /etc/init.d. Ponieważ używasz CentOS, kiedy już posiadasz skrypt w /etc/init.d, możesz po prostu użyć polecenia chkconfig, aby go wyłączyć lub włączyć na różnych poziomach pracy.

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

Usługa X nie obsługuje chkconfig. po uruchomieniu polecenia chkconfig -add X. jakiejkolwiek sugestii? – Jirapong

+0

Ach, przepraszam, okazuję się moją winą. literówka na #description. Wielkie dzięki! – Jirapong

+0

Wielka opinia, wielkie dzięki! –

7

Myślę, że najprostszym sposobem jest użycie daemon. Pozwala na uruchomienie dowolnego procesu jako demona. Oznacza to, że nie musisz się martwić o biblioteki, jeśli na przykład zdecydujesz się zmienić na pythona. Aby z niego skorzystać, po prostu użyj:

daemon myscript args 

Powinno być dostępne dla większości dystrybucji, ale może nie być domyślnie zainstalowane.

+0

To świetny pomysł, ale wiem, że niektóre środowiska produkcyjne nie mają dostępu do pliku binarnego demona. Osobiście uważam, że jest to bardziej platforma testowa/programistyczna niż coś, co można by wykorzystać w środowisku produkcyjnym przedsiębiorstwa. Ale dobre informacje - wcześniej o tym nie słyszałem. (Edycja: nie zdawałem sobie sprawy, że wątek miał 5 lat, ale nadal dotyczy IMO) –

36

Jeśli nie masz Proc::Daemon zgodnie z sugestią Chas. Owens, oto, jak zrobiłbyś to ręcznie:

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

Powiedziałbym, że łatwiej jest po prostu zainstalować Proc :: Daemon niż zawracać sobie głowę ręcznym rolowaniem, ale zawsze dobrze, że TMTOWTDI:) –

+0

Właściwie ten działał lepiej dla mnie niż poprzedni. Mam kontrolę nad każdym wyjściem wejściowym. Zgadnij, że możesz go również znaleźć w Proc :: Daemon! –

+7

Rewizja za niewymaganie modułu dodatkowego, co czasami ma znaczenie. –

Powiązane problemy