如何在 Java 守护进程中捕获 linux 用户注销信号?
How to trap the linux user log off signal in the Java daemon process?
我正在开发一个由 Java 编写的 linux 守护进程。如果当前用户注销,我需要捕获信号和 post 一些消息到远程服务器。如何在 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('.');
}
}
}
要测试你可以运行那样
- 在会话 1 中:运行 演示
java SigHupDemo
- 在会话 2 中:kill -s HUP $PID_OF_SIGHUPDEMO
发送 SIGHUP 后会话 1 中的输出将如下所示
....got a SIGHUP
...
演示将仅在 JVM 收到 SIGHUP
时打印 got a SIGHUP
。如代码中所述,您需要在那里实现自己的适当处理。
我正在开发一个由 Java 编写的 linux 守护进程。如果当前用户注销,我需要捕获信号和 post 一些消息到远程服务器。如何在 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('.');
}
}
}
要测试你可以运行那样
- 在会话 1 中:运行 演示
java SigHupDemo
- 在会话 2 中:kill -s HUP $PID_OF_SIGHUPDEMO
发送 SIGHUP 后会话 1 中的输出将如下所示
....got a SIGHUP
...
演示将仅在 JVM 收到 SIGHUP
时打印 got a SIGHUP
。如代码中所述,您需要在那里实现自己的适当处理。