【发布时间】: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