【问题标题】:PID of background task is different to the listed task PID using ps后台任务的 PID 与使用 ps 列出的任务 PID 不同
【发布时间】:2015-04-01 06:23:27
【问题描述】:

我有一个奇怪的问题,我无法完全理解。我所做的是运行一个名为 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 都匹配了!我想我可以从我的代码中删除反引号,但我真的不明白这是怎么回事!

【问题讨论】:

  • “什么都没有发生”可能意味着你杀了别人的pterm

标签: linux bash pid background-task


【解决方案1】:

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

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

【讨论】:

    最近更新 更多