【问题标题】:How can I get start-stop-daemon to write the child process ID to the pid file?如何让 start-stop-daemon 将子进程 ID 写入 pid 文件?
【发布时间】:2017-03-29 20:06:58
【问题描述】:

我正在编写一个 init.d 脚本来启动我用 C 编写的程序。该程序遵循一个非常标准的模板,它调用 fork() 来创建一个子进程,然后父进程几乎终止立即地。我遇到的问题是 PID 文件将父进程 ID 写入其中,所以后来当我调用“stop”时它失败了,因为父进程早已结束,只有子进程在运行。

目前我的启动脚本中有这个命令:

start-stop-daemon --start --background -m --oknodo --pidfile "$PIDFILE" --exec "$SCRIPT" || return 2

我承认我对这一切都很陌生,所以我什至不完全确定所有这些标志的作用。这主要是我偶然发现的各种文章的复制/粘贴。无论如何,这似乎是一件相当普遍的事情。如何让它在 pid 文件中写入正确的(即子)进程 ID?

【问题讨论】:

  • 要么:您将 PIDFILE 的路径传递给您的 C 程序,并且父级会将其子级的 PID 写入其中,或者 2.) 父级将子级的 PID 打印到标准输出/stderr,所以底层shell可以捕获它...... 3)你的C不会自己分叉,start-stop-deemon会将它发送到后台,所以它会知道它的PID。
  • 假设我选择了 2 号门,我将如何修改上面的 bash 命令来解决这个问题?
  • 好问题。 :) 我没有使用 ubuntu(甚至 linux),所以我不知道 start-stop-daemon 是如何工作的。 (否则我被添加了一个答案,而不仅仅是评论)。所以,最好等待一些更深入的答案......
  • 所以我看到如果我只写$SCRIPT >$PIDFILE 而不是上面的所有内容,它将成功启动守护进程并将正确的进程ID写入pidfile(因为我继续修改我的程序将其打印到标准输出)。但是,$SCRIPT >$PIDFILE 不包括任何检查 pidfile 是否已存在、进程是否已在运行等。它只是向前推进并无论如何启动它。而且我对 bash 不够熟悉,无法编写正确的 if 语句来更好地处理事情。

标签: bash debian sh start-stop-daemon


【解决方案1】:

守护进程需要自己创建 .pid 文件。由于它自己的守护进程,当您更改启动 pid 时。

选项--pidfile 用于已创建的pid 文件。 start-stop-daemon 也有选项--make-pidfile,但它只对不守护自己的程序有用。

-m, --make-pidfile ... 注意:此功能可能不适用于所有情况。最值得注意的是,当正在执行的程序从其主进程分叉时。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-09
    • 2013-09-05
    • 1970-01-01
    • 2012-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-05
    相关资源
    最近更新 更多