2017-02-27 8 views
-1

다음 코드를 사용하여 데몬을 만들었습니다. 제 질문은이 데몬을 시작하고 데몬을 /var/run/mydaemon.pid에 저장하는 스크립트를 만들고 싶습니다. 또한 저장된 mydaemon.pid 파일에 액세스하여 데몬을 중지하는 두 번째 스크립트.데몬의 저장소 PID를 시작하는 간단한 스크립트

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <sys/stat.h> 

#define EXIT_SUCCESS 0 
#define EXIT_FAILURE 1 

static void daemonize(void) 
{ 
    pid_t pid, sid; 

    /* already a daemon */ 
    if (getppid() == 1) return; 

    /* Fork off the parent process */ 
    pid = fork(); 
    if (pid < 0) { 
     exit(EXIT_FAILURE); 
    } 
    /* If we got a good PID, then we can exit the parent process. */ 
    if (pid > 0) { 
     exit(EXIT_SUCCESS); 
    } 

    /* At this point we are executing as the child process */ 

    /* Change the file mode mask */ 
    umask(0); 

    /* Create a new SID for the child process */ 
    sid = setsid(); 
    if (sid < 0) { 
     exit(EXIT_FAILURE); 
    } 

    /* Change the current working directory. This prevents the current 
     directory from being locked; hence not being able to remove it. */ 
    if ((chdir("/")) < 0) { 
     exit(EXIT_FAILURE); 
    } 

    /* Redirect standard files to /dev/null */ 
    freopen("/dev/null", "r", stdin); 
    freopen("/dev/null", "w", stdout); 
    freopen("/dev/null", "w", stderr); 
} 

int main(int argc, char *argv[]) { 
    daemonize(); 

    /* Now we are a daemon -- do the work for which we were paid */ 


    return 0; 
} 

주위를 둘러 보았고 나를 돕기 위해 예제 코드를 찾을 수없는 것처럼 보입니다. 내가 가지고있는 가장 가까운 것은 당신이 아래에서 보는 것입니다. 하지만 작동하지 않습니다.

#!/bin/sh 


set -e 

# Must be a valid filename 
NAME=mydaemon 
PIDFILE=/var/run/$NAME.pid 


DAEMON=/home/me/mydaemon/mydaemon/a.out 


export PATH="${PATH:+$PATH:}/usr/sbin:/sbin" 

case "$1" in 
    start) 
     echo -n "Starting daemon: "$NAME 
    start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON 
     echo "." 
    ;; 
    *) 
    echo "Usage: "$1" {start}" 
    exit 1 
esac 

exit 0 
+1

"* 작동하지 않습니다. *"는 다소 문제가있는 보고서입니다. – alk

+0

데몬이'getpid()'를 호출하고 그 결과를'/ var/run/mydeamon.pid'에 출력하게 하시겠습니까? – alk

+0

관련 : http://stackoverflow.com/q/3957242/694576 http://stackoverflow.com/q/24662327/694576 – alk

답변

-2

당신은 부모 C 프로그램이 반환 전화 를 종료하고 $에서 값을 읽을에 아이의 PID를 반환 할 수 있을까? 변수 호출.

./myDeamon

childPid = $?

+1

'$? '반환 상태는 최대 255 개의 값만 저장할 수 있습니다. PID는 훨씬 큰 범위를 커버합니다. –

0

작성된 데몬 코드를 사용하면 방금 시작한 데몬 프로세스의 PID를 확인할 수 없습니다. 해당 정보를 사용할 수 없기 때문입니다. 상위 프로세스 정보는 백그라운드에서 프로그램을 실행 한 경우에 사용할 수 있지만 (은 ./mydaemon &을 사용하는 경우 PID를보고합니다.) 해당 프로세스가 방금 종료되어 다른 프로세스가 실행되도록 남겨 두었습니다.

데몬 코드의 도움이 필요합니다. 상위 코드는 종료하기 전에 하위 프로세스의 PID를보고해야합니다.

/* If we got a good PID, report child PID and exit the parent process. */ 
if (pid > 0) { 
    printf("%d\n", (int)pid); 
    exit(EXIT_SUCCESS); 
} 

이제 사용할 수 있습니다 : 그것은 분기에 성공하지 않는 한

NAME=mydaemon 
# PIDFILE=/var/run/$NAME.pid 
# DAEMON=/home/me/mydaemon/mydaemon/a.out 

pidfile="/var/run/mydaemon.pid" 
pid=$($NAME) 
if [ -n "$pid" ] 
then 
    echo "$pid" > "$pidfile" 
else 
    echo "$0: failed to launch daemonized process '$NAME'" >&2 
    exit 1 
fi 

이 (데몬)에 코드에 의존 표준 출력에 기록되지. 오류를보고해야하는 경우 표준 오류에 쓸 수 있습니다.

+0

안녕하세요, Jonathan Leffler 감사합니다! 지금 스크립트를 실행할 때 /startrevd.sh가 나타납니다 : 데몬 프로세스를 시작하지 못했습니다. ''내가 놓친 것이 있습니까? – xxFlashxx

+0

나는 아마 모른다. 또는 나는 무엇인가 놓쳤다. 커맨드 라인에서'mydaemon'을 실행한다고 가정하십시오; 공정 번호를 알려주나요? 그렇다면,보고 된 숫자가 12345라고 가정하면'ps -fp 12345' 프로세스를 볼 수 있습니까? 신호를 보낼 수 있습니까? '12345 죽이기'? 문제가 발생하면 데몬을 올바르게 수정하지 않은 것입니다. 'sh -x startrevd.sh'의 출력을 질문에 추가해야 할 수도 있습니다 - 단어 _add_에 유의하십시오 (대부분의 정보는 변경하지 않습니다). –

+0

예를 들어,'./daemon'을 실행할 때 12345가 나타나지만 ps'-fp 12345'가 비어 있습니다 ... – xxFlashxx