bash setsid nohup ./prog & -- $!不指向子进程

bash setsid nohup ./prog & -- $! not pointed at child process

我试图通过 setsid 获取进程 I 运行 的 pid,并且应该 运行 在后台像这样:

test.sh:

#/bin/bash
setsid nohup ./my_program &
echo $!

如果我 运行 ./test.sh 它将打印 my_program 进程的 pid,这正是我所需要的。但是如果 运行 这个命令在我的 shell 中像这样一一命令:

$ setsid nohup ./my_program &
$ echo $!

它会给我一个 setsid 命令的 pid(或者可能是其他东西,但它几乎总是给我 my_program 减一的 pid)。

这里发生了什么?为什么我自己 运行 在终端中的命令结果与 test.sh 脚本的结果不同?

顺便说一句,您是否知道我从 setsid 开始并且需要在后台 运行 的一些简单流程?

转发以上评论作为回答:

这是因为setsid只有在当前进程是进程组组长时才会fork。可以找到详细的解释here.

要获取通过setsid执行的进程的pid,可以尝试给出的方法here

setsid 将调用 fork 以确保它创建一个新进程组以及一个新会话,因此生成的 pid 将与 setsid 的 pid 不匹配。最干净的解决方法是 my_program 将其 pid 存储到文件中。

当你稍后想要将 kill 发送到 my_program 时,你应该通过 /proc 文件系统或调用 ps 命令来检查 pid 是否确实与名为 my_program 的程序匹配围绕它的一些魔术代码。 (这是很多守护进程常用的方法)