我正在创建一个TFTP服务器并使用无限循环使其保持运行。当我尝试发送杀戮信号时
/bin/kill -s SIGINT <pid>
我希望Java进程关闭TFTP服务器并退出。
class TFTP {
public void startTFTP(String str, String str1){
try {
//Start TFTP server
// Both of below are not working.
Runtime.getRuntime().addShutdownHook(new Thread(){
@Override
public void run(){
//Shutdown tftp server
System.out.println("Exiting");
System.exit(0);
}
});
SignalHandler handler = new SignalHandler () {
public void handle(Signal signal) {
System.exit(0);
}
};
Signal.handle(new Signal("INT"), handler);
Signal.handle(new Signal("TERM"), handler);
while(true){
// Infinite loop to keep process running.
}
}
} catch (Exception e) {
}
}
public static void main(String args[]){
TFTP tftp = new TFTP();
tftp.startTFTP(args[0],args[1]);
}
}
我从脚本中删除进程并调用
/bin/kill -s SIGINT <pid>
由于某种原因没有杀死java进程。我认为SIGINT是作为
的一部分处理的Signal.handle(new Signal("INT"), handler);
我在这里缺少什么?
问候
Dheeraj Joshi
答案 0 :(得分:1)
我会在新线程中启动TFTP服务器,并在主线程中执行Thread.sleep(x)。这样,主线程就可以被中断了。
答案 1 :(得分:1)
我认为您需要发送'SIGTERM'('kill'w / o'-''参数)才能使shutdown hook工作。
答案 2 :(得分:1)
我刚刚读到:--- SIGTERM类似于要求进程很好地终止,允许清理和关闭文件。出于这个原因,在关机期间的许多Unix系统上,init向所有对关闭电源不重要的进程发出SIGTERM,等待几秒钟,然后发出SIGKILL强制终止剩余的任何此类进程。
所以你可能还需要在将来使用SIGKILL来处理非关闭电源的过程。 你可以检查需要被杀死的进程id并首先尝试使用SIGTERM,如果仍有一些进程,那么使用SIGKILL。或者如你所说,你可以先使用kill命令,然后使用-9杀死那些你想强行杀死的命令。