gpt4 book ai didi

c - 启动存储 pid 守护进程的简单脚本

转载 作者:行者123 更新时间:2023-11-30 19:52:34 35 4
gpt4 key购买 nike

我已成功使用以下代码创建了一个守护进程。我的问题是我想创建一个脚本来启动这个守护进程并将守护进程 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

最佳答案

使用编写的守护进程代码,您无法确定刚刚启动的守护进程的 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

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

关于c - 启动存储 pid 守护进程的简单脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42488972/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com