我正在编写通过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过程得到了适当的清理。
什么可能导致行为上的差异?
答案 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"});