2017-02-27 28 views
-1

我设法使用下面的代码来建立一个守护进程。我的问题是我想创建一个脚本来启动这个守护进程并将守护进程PID存储在/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个值; PIDs覆盖范围更广。 –

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

嗨乔纳森·勒弗勒谢谢!当我运行脚本时,我得到/.startrevd.sh:未能启动守护程序进程''有什么我错过了? – xxFlashxx

+0

我不知道 - 可能。或者我错过了什么。假设你从命令行运行'mydaemon';你有没有得到一个进程号码报告?如果是这样,假设报告的数字是12345,你能看到'ps -fp 12345'的过程吗?你能发送一个信号给它 - “杀死12345”吗?如果这些导致问题,那么你可能没有正确修改你的守护进程。您可能需要将'sh -x startrevd.sh'的输出添加到您的问题中 - 请注意单词_add_(保留大部分信息不变)。 –

+0

是的,例如当我运行'。/守护进程时,12345会显示出来,但是当我输入ps'-fp 12345'时,它是空的... – xxFlashxx