以Java的Process.exec开头的进程始终返回退出代码0

时间:2018-07-26 19:02:12

标签: java gradle process gradle-node-plugin

我使用Java Process.exec启动Shell脚本(出于某种原因),并且无论脚本本身的退出值如何,它们始终返回0退出值(我可以通过在OS Shell中运行该脚本来检查该退出脚本。有关其他信息,这些脚本使用gradle-node-plugin运行gradle任务。是否有此问题的指针?

总体而言,设置如下:

软件

  • Linux桌面4.4.0-130-通用#156〜14.04.1-Ubuntu SMP 2018年6月14日星期四13:51:47 UTC 2018 x86_64 x86_64 x86_64 GNU / Linux`

  • java版本“ 1.8.0_171” Java(TM)SE运行时环境(内部版本1.8.0_171-b11) Java HotSpot(TM)64位服务器VM(内部版本25.171-b11,混合模式)`

Shell脚本执行

Process process = Runtime.getRuntime().exec(new String[]{"sh", "-c", testScript});

返回值是通过test.exitValue()获得的,并且看起来始终为0。

Shell脚本调用gradle ./gradlew project:clean project:test

Gradle脚本依赖于gradle-node-plugin

plugins {
    id "com.moowork.node" version "1.2.0"
}

task test(type: NodeTask) {
    script = file('./node_modules/mocha/bin/mocha')
    args = ['test/sometest.js']
}

1 个答案:

答案 0 :(得分:1)

Gradle脚本阻止将退出代码返回到同一shell甚至终止调用shell的可能性。这是通过使用环境变量GRADLE_EXIT_CONSOLE(任意的非空值就足够了)完成的:

  • 如果已设置:脚本结束外壳程序并返回退出代码。
  • 如果未设置:该脚本将退出代码返回到调用Shell,从而使其能够继续处理命令。

如果您通过Runtime.exec调用gradle,它将创建一个新的shell,因此您需要在调用脚本之前设置该变量,以便在shell结束后获得退出代码。