用于启动守护程序的存储pid的简单脚本

时间:2017-02-27 15:02:00

标签: c linux sh daemon pid

我已设法使用以下代码制作守护程序。我的问题是我想创建一个脚本来启动这个守护进程并将守护进程PID存储在/var/run/mydaemon.pid中。此外,第二个脚本通过访问存储的mydaemon.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

2 个答案:

答案 0 :(得分:0)

使用写入的守护程序代码,您无法确定刚刚启动的守护进程的PID,因为该信息不可用。如果您在后台运行程序,则父进程信息可用(如果您使用<body> <div id="table"> <div id="year">2017</div> <div id="month"> <div id="pager"> <div id="previousMonth">Previous</div> <div id="nextMonth">Next</div> </div> <div id="monthname">January<div/> </div> </div> </div> </body> $!将报告PID),但该进程刚刚退出,另一个进程将继续运行。

您需要守护程序代码的帮助;父代码应该在退出之前报告子进程的PID。

./mydaemon &

现在你可以使用:

/* 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);
}

这依赖于代码(在守护进程中)不写入标准输出,除非它成功分叉。如果需要报告任何错误,它可以写入标准错误。

答案 1 :(得分:-2)

您可以在退出回拨的父C程序上返回子pid 并从$读取价值?调用脚本的变量。

./ myDeamon

childPid = $?