通过java和终端运行进程之间有区别吗?

时间:2013-01-05 23:12:53

标签: node.js shell groovy process

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

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

节点应用程序根据可用的数字处理器使用cluster to fork,但基本上主要工作是获取一些信息,然后通过exec()启动shell脚本。

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

什么可能导致行为上的差异?

1 个答案:

答案 0 :(得分:4)

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

您需要使用等效于popen的Java,运行bash并将命令作为参数执行,或者沿着这些行执行其他操作。

后者的一个例子是csh

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