【问题标题】:Inside a bash script, how to get PID from a program executed when using the eval command?在 bash 脚本中,如何从使用 eval 命令时执行的程序中获取 PID?
【发布时间】:2011-05-19 09:26:03
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: bash unix process eval pid


    【解决方案1】:

    您的 & 符号在 eval 行的背景下,导致(顶级)shell 派生一个子,子 shell 到 eval 字符串,然后作为顶级的孙子运行您的 java 程序贝壳。因此,$! 报告了子 shell 的 pid,这是最近的后台命令。

    而是在 eval 中移动背景:

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

    只要括号没有变得复杂到成为subshel​​l,上面的方法就可以了。

    【讨论】:

    • 是的,就是这样 :) EXPR="java -jar test.jar &"; eval $EXPR; echo $! 应该这样做
    • 仅供参考:我注意到这可以在终端上运行,但如果您的桌面上有一个带有图标的脚本,它就不起作用。
    • 确保在被评估的表达式周围添加"双引号,并确保在这些双引号内添加&,就在最后的双引号之前。
    猜你喜欢
    • 1970-01-01
    • 2012-08-25
    • 2015-01-09
    • 2014-02-27
    • 2018-07-02
    • 2021-02-12
    • 2020-12-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多