后台任务的 PID 与使用 ps 列出的任务 PID 不同

PID of background task is different to the listed task PID using ps

我有一个奇怪的问题,我无法完全理解。我所做的是 运行 一个名为 fn_rundumper 的函数,它基本上只调用 bash 代码:

pterm -z "cmd.sh" param1 &

这是它的输出,其中包括后台 pid“27938858”:

fn_rundumper
running fn_dumper...
[1] 27938858
fn_dumper...done

然后我查看 运行ning 的作业编号,这也显示 PID“27938858”:

jobs -l
[1] + 27938858 Running              $(pterm -z "$SCRIPTS_DIR/run_dumper.sh" $VO

然后我执行 ps 命令以查看 pterms 是什么 运行ning:

ps | grep pterm
 24285189 ?        00:00:00 pterm
 27938859 ?        00:00:00 pterm

这会产生 PID 27938859。这跟其他的不一样!

当我杀死 PID 27938858 时,似乎什么也没有发生。当我杀死 PID 27938859 然后后台 pterm 关闭。

问题是我可能想要 运行 许多不同的后台 pterms 以及一些未作为后台任务打开的 pterms(即单独 运行)。所以当我来整理时,我只想关闭我通过脚本打开的 pterms。

我试图使用 jobs -l 查看我需要关闭的 PID,但正如我刚才所描述的,这是错误的 PID。

谁能解释为什么会这样?还有我需要做什么才能获得正确的 PID? 谢谢!

- Edit1 -

我能想到的最好的办法是在前后做一个 ps | grep pterm 并比较结果以找到新的 pterm PID...可行,但很难看:(

- Edit2 -

我在命令行上再次测试了这个(没有函数调用):

我首先做了:

`pterm -z "$VOE_SCRIPTS_DIR/run_dumper.sh" $PROJECT_DIR` &

然后查看 ps / $! 结果并得到相同的行为。

然后我做了:

pterm -z "$VOE_SCRIPTS_DIR/run_dumper.sh" $VOE_PROJECT_DIR &

即删除了反引号,现在 PID 都匹配了!我想我可以从我的代码中删除反引号,但我真的不明白那是什么!

使用 $() 或反引号(命令替换)创建子 shell。所以 27938858 是子外壳的 PID,它又与 PID 27938859.

连接 pterm

命令替换在您的示例中似乎没有用,因此您应该将其删除。