在bash脚本中,如何从使用eval命令执行的程序中获取PID?

时间:2010-12-02 20:54:24

标签: bash unix process eval pid

我在bash脚本中有与此类似的命令:

eval "( java -classpath ./ $classname ${arguments[@]} $redirection_options $file )" &
pid=$!

但是,如果我执行ps $pid,它会显示主脚本进程而不是java程序的进程。

当我省略eval时,它获得了正确的过程,但是为了使一些复杂的参数正常工作,我需要使用它。

知道如何在eval命令中执行时获取java程序的PID吗?

1 个答案:

答案 0 :(得分:30)

您的&符号是eval行的背景,导致(顶级)shell将子进程分叉,子shell变为eval字符串,然后运行java程序作为孙子顶级shell。因此,$!报告子shell的pid,这是最近的后台命令。

而是在你的eval中移动背景:

eval "(java ...) &"
pid=$!

只要括号内容不够复杂,无法成为子shell ,上述方法就可以了。