bash setsid nohup ./prog& - $!没有指出儿童过程

时间:2016-04-22 12:07:13

标签: linux bash shell setsid

我试图获得我使用setsid运行的进程的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开始,我需要在后台运行吗?

2 个答案:

答案 0 :(得分:1)

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

这是因为如果进程组负责人,setsid只会分叉当前进程。可以找到详细的解释here

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

答案 1 :(得分:0)

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

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