【问题标题】:Java program exit with code "130"Java 程序退出代码“130”
【发布时间】:2015-04-27 04:14:39
【问题描述】:

当我在 intellJ 中关闭一个 java 程序时,控制台中会出现以下日志: "进程以退出代码 130 结束"

有时,代码是“1”。

我知道这是非常基本的,但我在网上搜索了一下,仍然找不到退出代码的解释。

代码是什么意思?我在哪里可以找到解释?

【问题讨论】:

  • ahh.. 所以它是 bash 代码,而不是 Java 程序中的代码。谢谢!
  • 如果按Ctrl+R重新运行程序或强行关闭程序,也是退出码130,不必按Ctrl+C初始化,只是OS范围的信号表示当前进程已收到终止信号的代码。

标签: java intellij-idea


【解决方案1】:

为了从 cmets 窃取 @Baby 的答案并将其形式化,this 声明 130 退出代码由 bash 给出,并表示该进程已由 SIGTERM 终止。通常这是用户按 Ctrl-C。

【讨论】:

  • 对我来说,这发生在我做docker logs <containerID> 时的一个 docker 容器中。不知何故在 docker 日志上执行 ^C 会杀死容器!
【解决方案2】:

如果您想获得许多在正常关闭后返回代码 0 的本机应用程序的行为,则此答案适用。

您可以注册一个执行正常关闭的钩子,例如释放应用保留的资源。如果优雅关闭成功,此钩子还可以将退出代码覆盖为 0。该钩子将在 SIGTERM 上调用(当用户按下 Ctrl+C 时发生)。

    Runtime.getRuntime()
        .addShutdownHook(
            new Thread(
                () -> {
                  //graceful shutdown steps
                  Runtime.getRuntime().halt(0); //override the exit code to 0
                }));

上述解决方案将阻止可能存在的其他钩子在此钩子之后运行。它还将阻止删除调用了.deleteOnExit() 的文件。

另一种方法可能是实现和注册SecurityManager,如下所示:

  static class Converting130To0SecurityManager extends SecurityManager {
    @Override
    public void checkExit(int status) {
      if (status == 130) {
        System.exit(0);
      } else {
        super.checkExit(status);
      }
    }

    @Override
    public void checkPermission(Permission perm) {
      // Allow all activities by default
    }
  }

  ...
  System.setSecurityManager(new Converting130To0SecurityManager());

这样的安全管理器将始终将 130 代码转换为 0,而与正常关闭无关。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-12-19
    • 2021-06-26
    • 2014-07-29
    • 2011-08-10
    • 1970-01-01
    • 2012-07-07
    • 1970-01-01
    • 2012-07-20
    相关资源
    最近更新 更多