笔记:我已将其移至 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
。