2011-11-14 4 views
21

데몬스트레이션 할 Perl 스크립트가 있습니다. 기본적으로이 perl 스크립트는 30 초마다 디렉토리를 읽고, 찾은 파일을 읽은 다음 데이터를 처리합니다. 그래서이 스크립트는 기본적으로 뭔가 매 3 초마다 인쇄/etc/init.d 스크립트의 데몬 호출이 백그라운드에서 실행 중이 아닌 블로킹 중입니다.

#!/usr/bin/perl 
use strict; 
use warnings; 

my $continue = 1; 
$SIG{'TERM'} = sub { $continue = 0; print "Caught TERM signal\n"; }; 
$SIG{'INT'} = sub { $continue = 0; print "Caught INT signal\n"; }; 

my $i = 0; 
while ($continue) { 
    #do stuff 
    print "Hello, I am running " . ++$i . "\n"; 
    sleep 3; 
} 

: 간단 여기에 다음과 같은 펄 스크립트를 고려 유지하기 위해 (synpipe_server 전화를 /usr/sbin/에서이 스크립트의 심볼릭 링크가있다).

#!/bin/bash 
# synpipe_server : This starts and stops synpipe_server 
# 
# chkconfig: 12345 12 88 
# description: Monitors all production pipelines 
# processname: synpipe_server 
# pidfile: /var/run/synpipe_server.pid 
# Source function library. 
. /etc/rc.d/init.d/functions 

pname="synpipe_server" 
exe="/usr/sbin/synpipe_server" 
pidfile="/var/run/${pname}.pid" 
lockfile="/var/lock/subsys/${pname}" 

[ -x $exe ] || exit 0 

RETVAL=0 

start() { 
    echo -n "Starting $pname : " 
    daemon ${exe} 
    RETVAL=$? 
    PID=$! 
    echo 
    [ $RETVAL -eq 0 ] && touch ${lockfile} 
    echo $PID > ${pidfile} 
} 

stop() { 
    echo -n "Shutting down $pname : " 
    killproc ${exe} 
    RETVAL=$? 
    echo 
    if [ $RETVAL -eq 0 ]; then 
     rm -f ${lockfile} 
     rm -f ${pidfile} 
    fi 
} 

restart() { 
    echo -n "Restarting $pname : " 
    stop 
    sleep 2 
    start 
} 

case "$1" in 
    start) 
     start 
    ;; 
    stop) 
     stop 
    ;; 
    status) 
     status ${pname} 
    ;; 
    restart) 
     restart 
    ;; 
    *) 
     echo "Usage: $0 {start|stop|status|restart}" 
    ;; esac 

exit 0 

그래서 (나는 경우도 디먼에 대한 문서를 이해) :이 스크립트를 디먼 화 원하는대로

다음, 나는 또한 /etc/init.d/이 bash는 스크립트 (또한 synpipe_server)를 넣었습니다 펄 스크립트는 백그라운드에서 실행해야 내가 실행하면 출력이 /dev/null로 리디렉션해야합니다 여기

service synpipe_server start 

을하지만 것은 내가 대신 무엇을 얻을 수 있습니다 :

[[email protected] init.d]# service synpipe_server start 
Starting synpipe_server : Hello, I am running 1 
Hello, I am running 2 
Hello, I am running 3 
Hello, I am running 4 
Caught INT signal 
                  [ OK ] 
[[email protected] init.d]# 

그래서 Perl 스크립트를 시작하지만 현재 터미널 세션에서 분리하지 않고 실행합니다. 내 콘솔에 출력물이 표시되는 것을 볼 수 있습니다 ... 이것은 내가 기대했던 것이 아닙니다. 또한 PID 파일은 비어 있습니다 (또는 줄 바꿈 전용으로, 데몬에 의해 반환 된 PID 없음).

내가 뭘 잘못하고 있는지 알 수있는 사람이 있습니까?

EDIT : 아마 내가 Red Hat 시스템에 있다고 말할 것입니다.

Scientific Linux SL release 5.4 (Boron) 

감사합니다, man daemon 올바른 구문에 따르면 토니

+3

대신의 변화를 폴링하는 데몬을 작성, 당신은 때 변경 사항을 알려 http://en.wikipedia.org/wiki/Inotify을 inotify를 사용할 수 있습니다 그것이 일어났다. 코드를 작성하는 것이 더 쉽고 효율적이며 업데이트를 더 빠르게 볼 수 있습니다. CPAN 모듈은 여러 가지가 있습니다. http://search.cpan.org/search?query=inotify&mode=all – Schwern

+0

감사합니다.이 정보는 유용합니다. Inotify를 살펴 보겠습니다. – tony

+0

@Schwern : inotify 알림을 기다리는 백그라운드에서 데몬을 실행해야한다는 사실을 변경하지 않습니다. – tony

답변

15

을 bash init 스크립트에서 함수를 시작하고, 나는를 사용하지 않는다.더 이상.

pid 파일이 이미 존재하지 않는지 확인합니다 (그렇다면 경고를 작성하십시오). 그렇지 않은 경우

nohup ${exe} >/dev/null 2>&1 & 

을 사용하여 스크립트를 시작합니다.

안전한 지 (?) 모르겠지만 작동합니다.

+2

비슷한 것을 사용했지만, 스크립트가 시작되었을 때 보여지는 출력을 제공하기 위해 nohup과 함께'daemon'을 사용했습니다. nohup이 실행되는 동안 [OK] 메시지는 항상 OK로 돌아올 것이므로 시각적 인 단서가됩니다. 'daemon'nohup $ {exe}>/dev/null 2> & 1 & "& '' 을 예로들 수 있습니다. – Rohaq

+0

tony, 쉘이 종료 될 때이 데몬이 죽지 않습니까? 또는 nohup는 그것을 방지합니까? – Mark

+0

예, 쉘이 종료되면 nohup에 의해 작성된 프로세스가 활성 상태로 남아 있습니다. – tony

0

이다

daemon [options] -- [command] [command args] 

같은 것을 실행해야합니다 귀하의 init 스크립트의 시작 : 나는 마침내를 썼다 다시

daemon --pidfile ${pidfile} -- ${exe} 
+3

감사합니다 yko,하지만 내 '데몬'사용법 때문에 '데몬 [+/- nicelevel] {프로그램}'때문에이 문제가 아닙니다. 아마 우리는 같은 버전을 가지고 있지 않습니다. – tony

+0

@tony 명령 사용 문제를 해결할 수 있었습니까? –

+0

@tony libslack에서 [daemon] (http://libslack.org/daemon/#download)을 설치했다. –

0

마찬가지로 here처럼 프로세스는 &을 사용하여 백그라운드로 보내야하는 것으로 보입니다. 데몬이 당신을 위해 그것을하지 않습니다.

1

프로세스를 대몬 화하는 적절한 방법은 터미널 그 자체로는에서 분리해야합니다. 이것이 가장 큰 소프트웨어 제품군이 수행하는 방법입니다 (예 : apache).

daemon 뒤에 이론적 근거는 그 이름에서 기대할 수있는 일을하지, 어떻게 만드는 유닉스 프로세스가 분리 배경으로, 나는 내 프로그램 데몬처럼 행동 얻는 방법 섹션 1.7 here를 찾을 수 있습니까?

단순히 백그라운드에서 프로그램을 호출하는 것은 이 장기 실행 프로그램에 정말 적합하지; 그 프로세스를 시작한 터미널 세션에서 프로세스를 올바르게 분리하지 않습니다. 또한 데몬을 시작하는 일반적인 방법은 단순히 명령을 수동으로 또는 rc 스크립트에서 실행하는 것입니다. 데몬이 자신을 에 삽입해야합니다. 더이 주제에 대한 독서를 들어

: What's the difference between nohup and a daemon?