我试图获得我使用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开始,我需要在后台运行吗?
答案 0 :(得分:1)
答案 1 :(得分:0)
setsid将调用fork以确保它创建一个新进程组以及一个新会话,因此生成的pid将与setsid的pid不匹配。最干净的解决方法是my_program将其pid存储到文件中。
当你以后想要将kill发送到my_program时,你应该检查pid是否通过/ proc文件系统实际匹配了一个名为my_program的程序,或者使用一些魔术代码调用ps命令。 (这是许多守护进程使用的一种非常常见的方法)