我在bash脚本中有与此类似的命令:
eval "( java -classpath ./ $classname ${arguments[@]} $redirection_options $file )" &
pid=$!
但是,如果我执行ps $pid
,它会显示主脚本进程而不是java程序的进程。
当我省略eval时,它获得了正确的过程,但是为了使一些复杂的参数正常工作,我需要使用它。
知道如何在eval命令中执行时获取java程序的PID吗?
答案 0 :(得分:30)
您的&符号是eval
行的背景,导致(顶级)shell将子进程分叉,子shell变为eval
字符串,然后运行java程序作为孙子顶级shell。因此,$!
报告子shell的pid,这是最近的后台命令。
而是在你的eval中移动背景:
eval "(java ...) &"
pid=$!
只要括号内容不够复杂,无法成为子shell ,上述方法就可以了。