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

时间:2015-02-02 10:22:43

标签: linux bash pid background-task

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

pterm -z "cmd.sh" param1 &

这是输出,包括背景pid" 27938858":

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

然后我看看正在运行的工作号码也显示了PID" 27938858":

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

然后我执行ps命令查看pterms正在运行的内容:

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

这会产生PID 27938859。这与其他人不同!

当我杀死PID 27938858时似乎没有任何事情发生。当我杀死PID 27938859时,背景pterm将被关闭。

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

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

任何人都能解释为什么会这样吗?以及我需要做些什么来获得正确的PID? 谢谢!

- 编辑1 -

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

- 编辑2 -

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

首先我做了:

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

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

然后我做了:

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

即。删除后退,现在PID全部匹配!我想我可以从我的代码中删除后面的代码,但我真的不明白这是什么意思!

1 个答案:

答案 0 :(得分:2)

使用$()或反引号(命令替换)创建子shell。所以27938858是一个子shell的PID,它反过来用pterm标记27938859

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