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

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

笔记:我已将其移至 stack-overflow,我认为那是正确的位置:这里

我遇到了一个奇怪的问题,我不太明白。我所做的就是运行一个名为 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(即单独运行)。因此,当我来整理时,我只想关闭通过脚本打开的 pterm。

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

有人能解释为什么会发生这种情况吗?以及我需要做什么才能获得正确的 PID?谢谢!

- 编辑 - 我能想到的最好的办法是在前后执行“ps | grep pterm”,然后比较结果以找到新的 pterm PID……可行,但很丑陋:(

答案1

实际情况是,您正在创建两个进程,第一个是您的函数的进程fn_rundumper,第二个是pterm您的函数打开的进程。这样,您的函数调用将采用以 858 结尾的 pid,而pterm从您的函数调用将采用其后的下一个 pid,以 859 结尾。

至于第一个 pid pterm,它是您用来执行函数的终端的 pid。这就是为什么杀死它会杀死其中创建的所有内容(只要您不使用该nohup命令)。

要在命令中查看相同的 pid ps,请尝试: ps | grep run_dumper.sh,它是运行函数的 bash 脚本的 pid fn_rundumper

相关内容