【问题标题】:Java - programmatically set exit code from SIGTERMJava - 以编程方式从 SIGTERM 设置退出代码
【发布时间】:2020-06-30 16:06:02
【问题描述】:

情况:我有一个保持活动状态的 shell 脚本,它会在应用程序关闭时重新启动它。但是,如果应用程序通过SIGTERMSIGINTkillCtrl+C 等)(即关闭挂钩)关闭,我不希望它这样做。但是,当由于调用 exit 是非法的而从关闭挂钩退出时,我无法设置退出代码,因此无法与 keep-alive 脚本通信。

来自 exit 的 Javadocs:

如果在虚拟机开始其关闭序列之后调用此方法,则如果正在运行关闭挂钩,则此方法将无限期阻塞。如果已经运行了关闭挂钩并且已启用退出终止,则此方法会在状态非零时使用给定的状态代码暂停虚拟机;否则,它会无限期地阻塞。

这可能吗?

【问题讨论】:

    标签: java shutdown


    【解决方案1】:

    如果进程已被信号杀死,则$?变量will be set to 128 + signal

    bash$ sleep 3;echo $?
    0
    
    bash$ sleep 3;echo $?
    ^C
    130
    

    这里,130128 + SIGINT

    【讨论】:

    • 这对我来说既不适用于bash,也不适用于zsh:/
    【解决方案2】:

    在变量中获取进程的 PID 并使用 wait 内置函数:如果进程已被信号终止,则 wait 的返回码将为 128 + 信号编号。

    #
    # Note: output from shell trimmed
    #
    # Launch cat in the background, capture the PID
    $ cat & PIDTOCHECK=$!
    $ echo $PIDTOCHECK
    27764
    #
    # Call wait a first time: the program is halted waiting for input (SIGTTIN)
    #
    $ wait $PIDTOCHECK ; echo $?
    149
    #
    # Now kill cat, and call wait again
    #
    $ kill %1
    $ wait $PIDTOCHECK ; echo $?
    143
    

    【讨论】:

      【解决方案3】:

      这是我的工作:

      Runtime.getRuntime().halt(0);
      

      请注意,这将立即退出程序,因此您需要在最后一个关闭挂钩完成后执行此操作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-08-08
        • 2019-05-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多