/etc/init.d 스크립트에서 데몬 호출이 차단되고 백그라운드에서 실행되지 않음


9

데몬 화하려는 Perl 스크립트가 있습니다. 기본적으로이 perl 스크립트는 30 초마다 디렉토리를 읽고 찾은 파일을 읽은 다음 데이터를 처리합니다. 여기서 간단하게 유지하려면 다음 Perl 스크립트 (synpipe_server라고 함 /usr/sbin/) 에이 스크립트의 심볼릭 링크가 있습니다 .

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

이 스크립트는 기본적으로 3 초마다 무언가를 인쇄합니다.

그런 다음이 스크립트를 데몬으로 사용하기 위해이 bash 스크립트 (synpipe_server라고도 함)를 넣었습니다 /etc/init.d/.

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

따라서 (데몬의 doc을 잘 이해했다면) Perl 스크립트는 백그라운드에서 실행해야하며 출력을 /dev/null실행하면 리디렉션되어야합니다 .

service synpipe_server start

그러나 여기에 내가 얻는 것이 있습니다 :

[root@master 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  ]
[root@master init.d]# 

따라서 Perl 스크립트를 시작하지만 현재 터미널 세션에서 분리하지 않고 실행하며 콘솔에서 출력이 인쇄되는 것을 볼 수 있습니다 ... 실제로 기대했던 것과 다릅니다. 또한 PID 파일이 비어 있습니다 (또는 라인 피드 만 있고 daemon이 pid를 리턴하지 않음 ).

누구든지 내가 뭘 잘못하고 있는지 알고 있습니까?

편집 : 어쩌면 내가 Red Hat 컴퓨터에 있다고 말해야합니다.

Scientific Linux SL release 5.4 (Boron)

데몬 기능을 사용하는 대신 다음과 같은 작업을 수행하면 작업을 수행합니까?

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

init 스크립트에서?

답변:


4

redhat init 스크립트 daemon함수 의 추가 계층을 추가하는 대신 perl 스크립트를 직접 디 먼싱하십시오 . 데몬을 직접 작성하려고하면 데몬을 얻는 것이 어렵습니다. Proc :: Daemon 은 매우 간단합니다.

또한 perl daemons 작성 방법에 대한 설명이 있습니다.

보너스 답변 : daemontoolsProc :: Daemontools 사용하십시오 . 그것은 포괄적 인 데몬 관리 시스템을 제공하며 아마도 이미 이미 daemontools를 설치했을 것입니다. 어떤 사람들은 daemontools를 싫어하지만 작업이 완료됩니다.

몇 번이나 데몬을 작성하더라도 여전히 이상하게 보입니다. 어쩌면 나는 dæmon을 사용해야합니다.


2

데비안과 그 파생어를 사용 start-stop-daemon하는 경우 -b 옵션과 함께 사용 하면 문제없이 프로세스를 시작할 수 있습니다.


이것은 레드햇 기계, 그래서 사용해야 daemon하고 killproc대신
MariuszS

1
이것은 오늘 내 문제를 해결했습니다. 우분투에서는 /etc/init.d/skeleton을 복사했는데 왜 백그라운드에서 실행되지 않았는지 알 수 없었습니다. 나는 이미 배경으로 설정되었다고 가정했지만 그렇지 않은 것으로 나타났습니다.
Ryan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.