【问题标题】:Process started with java's Process.exec always returns exit code 0以 java 的 Process.exec 开始的进程总是返回退出代码 0
【发布时间】:2019-01-03 20:47:01
【问题描述】:

我使用 java Process.exec 启动 shell 脚本(出于某种原因),无论脚本本身的退出值如何,它们总是返回 0 退出值(我可以通过在 OS shell 中运行所述脚本来检查。有关其他信息,那些脚本使用 gradle-node-plugin 运行 gradle 任务。对此问题有任何指示吗?

总体来说,设置如下:

软件

  • Linux 桌面 4.4.0-130-generic #156~14.04.1-Ubuntu SMP Thu Jun 14 13:51:47 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux`

  • java 版本“1.8.0_171” Java(TM) SE 运行时环境 (build 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']
}

【问题讨论】:

  • 请把代码贴出来,不然我们也猜猜Java是怎么想的
  • @Lino 我添加了一些代码 sn-ps
  • 1) 为了尽快获得更好的帮助,请发帖 minimal reproducible exampleShort, Self Contained, Correct Example。 2) 另请参阅When Runtime.exec() won't,了解有关正确创建和处理流程的许多好技巧。然后忽略它引用exec 并使用ProcessBuilder 创建进程。还将String arg 分解为String[] args 以解决包含空格字符的路径之类的问题。
  • 在调用gradlew之前尝试为环境变量GRADLE_EXIT_CONSOLE设置一个值?
  • @LittleSanti 这很好地解决了我的问题 - 哇!有趣的事实是,互联网上没有太多信息,但它存在于 gradle 的源代码中(以及每个 gradlew 文件中!)。想知道您是如何获得这些知识的,但同时请发表您的评论作为答案,以便我接受。

标签: java gradle process gradle-node-plugin


【解决方案1】:

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

  • 如果设置:脚本结束 shell 并返回退出代码。
  • 如果未设置:脚本将退出代码返回给调用 shell,允许它继续处理命令。

如果你通过Runtime.exec调用gradle,它会创建一个新的shell,所以你需要在调用脚本之前设置那个变量,这样你就可以在shell结束后得到退出代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-09
    • 2018-09-12
    • 2022-01-22
    • 1970-01-01
    • 2017-01-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多