0

我有一个奇怪的问题,我无法完全理解。我所做的是运行一个名为 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关闭。

问题是我可能想要运行许多不同的后台 pterm 以及一些未作为后台任务打开的 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 都匹配了!我想我可以从我的代码中删除反引号,但我真的不明白那是什么意思!

4

1 回答 1

2

使用$()或反引号(命令替换)创建一个子shell。子shell 的 PID 也是如此27938858,而子shell 又pterm与 PID关联27938859

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

于 2015-02-02T10:49:59.940 回答