kill命令其实比较让人难以理解的点在于信号这块,开发中kill -9
经常用,但却很少去深入了解其他信号参数的具体作用,本文主要是就信号这块做一个解释。
实验代码
public static void main(String[] args) {
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
System.out.println("Shutdown Hook is running!");
// Perform cleanup tasks here
try {
TimeUnit.SECONDS.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Shutdown Hook is ending!");
}));
System.out.println("Application is running...");
try {
Thread.sleep(15000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Application is exiting...");
}
SIGTERM(15)
停止/终止进程,进程如果有捕获该操作,会对资源进行清理后再退出,java进程捕获操作为Runtime.getRuntime().addShutdownHook(Thread t)。
SIGKILL(9)
强制终止进程,不能被捕获或忽略,因此进程没有机会进行清理。
SIGSTOP
暂停进程,不能被捕获或忽略,收到该信号进程将被挂起。
SIGCONT
恢复被挂起的进程,恢复被停止的进程,配对SIGSTOP使用。
SIGHUP
挂起进程,行为有点类似SIGTERM,但是语义不同,该信号多用于通知进程重新加载配置等操作,守护线程多依据这个状态重新加载配置等,而不是退出进程。
SIGINT
中断进程,可以被捕获,通常由 Ctrl+C 产生,用于终止进程。
SIGQUIT
退出信号,通常由 Ctrl+\ 产生,用于终止进程并生成核心转储文件。