2009-04-19 3 views

답변

81

가장 쉬운 방법은 Proc::Daemon입니다.

  1. 포크 아이를 부모 프로세스를 종료 :

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

    다른 방법으로 당신은 PROC : 데몬이하는 모든 일을 할 수 있었다.

  2. 세션 리더 (제어 터미널에서 프로그램을 분리 함)가 되십시오.
  3. 다른 하위 프로세스를 포크하고 첫 번째 자식을 종료합니다. 이것은 제어 터미널을 획득 할 가능성을 방지합니다.
  4. 현재 작업 디렉토리를 "/"으로 변경하십시오.
  5. 파일 생성 마스크를 지 웁니다.
  6. 열려있는 파일 설명자를 모두 닫습니다.

런레벨 시스템과의 통합은 쉽습니다. 다음과 같은 스크립트가 필요합니다 (XXXXXXXXXXXX을 Perl 스크립트의 이름으로 대체하십시오 (예 : YYYYYYYYYYYYYYYYYYY). 설명은 /path/to이고, 펄 스크립트의 경로는 /etc/init.d입니다. CentOS를 사용하고 있으므로, 일단 /etc/init.d에 스크립트가 있으면 chkconfig를 사용하여 다양한 런레벨에서 사용 또는 사용 중지 할 수 있습니다.

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

제가 가지고있는 서비스 X는 chkconfig를 지원하지 않습니다. 언제 Chkconfig를 실행 - 추가 X. 어떤 제안? – Jirapong

+0

아, 죄송합니다. 내 잘못이라고 밝혀졌습니다. # 설명에 오타가 있습니다. 많은 감사합니다! – Jirapong

+0

큰 피드백, 큰 감사! –

7

가장 쉬운 방법은 daemon을 사용하는 것입니다. 모든 프로세스를 데몬으로 실행할 수 있습니다. 즉, 예를 들어 Python으로 변경하기로 결정한 경우 라이브러리에 대해 걱정할 필요가 없습니다. 이를 사용하려면 다음을 사용하십시오 :

daemon myscript args 

이 파일은 대부분의 배포판에서 사용할 수 있지만 기본적으로 설치되지 않을 수 있습니다.

+0

멋진 아이디어지만 일부 프로덕션 환경에서는 데몬 바이너리에 액세스 할 수 없다는 것을 알고 있습니다. 개인적으로 필자는 엔터프라이즈 프로덕션 환경에서 사용하는 것보다 더 많은 테스트/개발 플랫폼을 보게 될 것입니다. 좋은 정보 - 그래도 전에 들어 본 적이 없어요. (편집 : 스레드가 5 세 였지만 아직 IMO가 아니라는 것을 깨닫지 못했습니다.) –

36

Chas가 제안한 Proc::Daemon이없는 경우 Owens, 여기에 당신이 손으로하는 방법이 있습니다 :

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

Proc :: Daemon을 손으로 구르는 것보다 쉽게 ​​설치하는 것이 훨씬 쉽지만 TMTOWTDI는 항상 좋습니다.) –

+0

실은 그 중 하나가 이전보다 더 잘 작동했습니다. 모든 입력 출력을 제어 할 수 있습니다. Proc :: Daemon에서도 찾을 수있을 것입니다! –

+7

때로는 중요하지 않은 비 핵심 모듈을 필요로하지 않기 때문에 Upvoted. –

관련 문제