【问题标题】:Is there a difference between running a process through java vs terminal?通过 java 和终端运行进程有区别吗?
【发布时间】:2013-01-05 23:12:53
【问题描述】:

我正在编写一个node.js 应用程序,通过linkedin 的glu 平台部署。

启动命令调用sudo -u <user> node app.js 以正确用户身份启动节点应用程序,基本上将此命令存储为字符串并在其上调用Groovy 的exec() 命令。

节点应用程序根据可用的处理器数量使用集群来分叉,但基本上它的主要工作是获取一些信息,然后通过exec() 启动一个 shell 脚本。

有时shell脚本会出错,这没关系,但问题是当在glu下运行时,有时这些shell脚本会因错误而失效,但我应该通过终端使用sudo -u <user> node app.js启动节点进程,进程启动正常,shell 进程得到正确清理。

什么可能导致行为差异?

【问题讨论】:

    标签: node.js shell groovy process


    【解决方案1】:

    是的,有。一个在 shell 中运行,一个直接执行。在 shell 中运行它和通过底层 Posix exec(3) 和 co 运行它之间,管道、shell 变量、命令行选项等的处理都非常不同。 (即,在 Java 中使用 exec() 不会导致您的进程在/系统 shell 中运行。)

    您需要使用 popen 的 Java 等效项,运行 bash 并将您的命令作为参数执行,或者类似这些行的其他内容。

    后者的一个例子是csh

    Process p = Runtime.getRuntime().exec(new String[]{"csh","-c","cat ~/myfile.txt"});

    【讨论】:

    • 在多做几次 poc 并在以几种不同方式启动进程后检查进程的运行时环境后,您的建议肯定有效。但是在使用 bash 启动您的建议所显示的进程后,我仍然遇到了已失效的 shell 进程。我设法解决这个问题的唯一方法是使用 disown %1 以便子进程不在 java 进程之下。我知道 java 进程仍在从子进程获取 stdout 和 err 流,但据我所知,这不应该导致这个问题。
    猜你喜欢
    • 1970-01-01
    • 2017-01-24
    • 1970-01-01
    • 2015-06-23
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 2011-07-11
    • 2014-05-06
    相关资源
    最近更新 更多