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是的,我认为第一个链接正是我所需要的。谢谢!你能把这个写下来作为我的答案吗?请尽量写一个足够具体的标题,让大家知道你的问题是关于什么的(因此,如果他们对$!,有自己的问题,你的问题的答案是否对他们也适用和有用),而不需要点击阅读;我试着在这里编辑它。