Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux bash setsid nohup./prog&;--$!不指向子进程_Linux_Bash_Shell_Setsid - Fatal编程技术网

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

Linux bash setsid nohup./prog&;--$!不指向子进程,linux,bash,shell,setsid,Linux,Bash,Shell,Setsid,我试图获取我使用setsid运行的进程的pid,该进程应该在后台运行,如下所示: test.sh: #/bin/bash setsid nohup ./my_program & echo $! $ setsid nohup ./my_program & $ echo $! 如果我运行/test.sh它将打印我的程序进程的pid,这正是我需要的。但是如果在我的shell中一个接一个地运行以下命令: test.sh: #/bin/bash setsid nohup ./my_

我试图获取我使用
setsid
运行的进程的pid,该进程应该在后台运行,如下所示:

test.sh:

#/bin/bash
setsid nohup ./my_program &
echo $!
$ setsid nohup ./my_program &
$ echo $!
如果我运行
/test.sh
它将打印
我的程序
进程的pid,这正是我需要的。但是如果在我的shell中一个接一个地运行以下命令:

test.sh:

#/bin/bash
setsid nohup ./my_program &
echo $!
$ setsid nohup ./my_program &
$ echo $!
它将给我一个
setsid
命令的pid(或者可能是其他的,但它几乎总是给我
myu程序的pid
减一)

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


顺便说一句,您可能知道一些简单的处理方法,我是从setsid开始的,需要在后台运行吗?

将上面的评论作为一个答案重新发布:

这是因为,如果当前流程是流程组长,则setId只对其进行分叉。可以找到详细的解释


要通过setsid获取进程的pid,可以尝试给定的方法。

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


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

可能与setId的分叉行为有关?只有当它是流程组长时,它才会分叉;请参阅。要通过setsid获取进程的pid,您可以尝试@0range是的,我认为第一个链接正是我所需要的。谢谢!你能把这个写下来作为我的答案吗?请尽量写一个足够具体的标题,让大家知道你的问题是关于什么的(因此,如果他们对$!,有自己的问题,你的问题的答案是否对他们也适用和有用),而不需要点击阅读;我试着在这里编辑它。