java - 如何在 Java 守护进程中捕获 linux 用户注销信号?

标签 java linux signals

我正在研究一个由 Java 编写的 linux 守护进程。如果当前用户注销,我需要捕获信号并将一些消息发送到远程服务器。如何在 Java 代码中捕获当前用户注销信号? SIGHUP 信号可以工作吗?任何人都可以提供一些线索吗?

非常感谢。

最佳答案

您可以注册一个信号处理程序来处理 SIGHUP。

import sun.misc.Signal;
import sun.misc.SignalHandler;

public class SigHupDemo {
  public static void main(String[] args) throws Exception {

    // you can also register for "TERM" - SIGTERM
    Signal.handle(new Signal("HUP"), new SignalHandler () {
      public void handle(Signal sig) {
        System.out.println("got a SIGHUP");
        // do what you want to do in such case
        // also include to end your daemon
      }
    });

    for(int i=0; i<100; i++) {
      Thread.sleep(1000);
      System.out.print('.');
    }
  }
}

要测试你可以那样运行它

  • 在 session 1 中:运行演示 java SigHupDemo
  • 在 session 2 中:kill -s HUP $PID_OF_SIGHUPDEMO

发送 SIGHUP 后, session 1 中的输出将如下所示

....got a SIGHUP
...

如果 JVM 收到 SIGHUP,该演示只会打印 got a SIGHUP。如代码中所述,您需要在那里实现自己的适当处理。

关于java - 如何在 Java 守护进程中捕获 linux 用户注销信号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29253398/

相关文章:

java - JavaFX 中带有 sleep 的 Settext

linux - sed 不替换完整的句子

linux - AWK If/Else 条件问题

linux - 信号处理程序 (segv) 无法在设备崩溃前完成

c - SIGCHLD 导致段错误,未进入处理程序

java - OpenAL 听者方向从俯仰、偏航和滚转

java - 如何将图像放入特定的 JPanel 中?

linux - 加载栏 - Bash 脚本

Android:在电话中操纵语音

java - 如何在使用 com.sun.org.apache.xerces.internal.parsers.SAXParser 的 SAXBuilder 中禁用 XML 外部实体 (XEE) 处理