3

我试图获取我运行的进程的 pid,setsid它应该像这样在后台运行:

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脚本的结果不同?

顺便说一句,您可能知道我从 setid 开始并且需要在后台运行的一些简单的过程方法吗?

4

2 回答 2

1

重新发布以上评论作为答案:

这是因为 setsid 仅在当前进程是进程组领导时才会分叉。可以在这里找到详细的解释。

要获得通过setsid 执行的进程的pid,可以尝试这里给出的方法。

于 2016-04-22T18:41:44.327 回答
1

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

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

于 2016-04-22T22:45:39.823 回答