后台任务的 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
命令替换在您的示例中似乎没有用,因此您应该将其删除。
我有一个奇怪的问题,我无法完全理解。我所做的是 运行 一个名为 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
命令替换在您的示例中似乎没有用,因此您应该将其删除。