我正在运行一个 SpringBoot 应用程序。我使用@PreDestroy注释添加了一些清理操作。当我使用 SIGTERM 终止 tomcat 的 ${PID} 的进程时,它通过调用标有 @PreDestroy 的方法执行所有清理任务。但是,当我使用 SIGKILL 即杀死 -9 ${PID} 的雄猫时,不会执行清理。
有没有办法让应用程序在使用 SIGKILL 终止时执行所有销毁前工作?
不,没有。 常规kill
等待进程退出,而kill -9
则不退出并立即将其杀死。重要的是,SIGKILL和SIGSTOP的信号不能被捕获,阻止或忽略。MAN 7 信号显示了每个信号含义的简短摘要:
Signal Value Action Comment
──────────────────────────────────────────────────────────────────────
SIGHUP 1 Term Hangup detected on controlling terminal
or death of controlling process
SIGINT 2 Term Interrupt from keyboard
SIGQUIT 3 Core Quit from keyboard
SIGILL 4 Core Illegal Instruction
SIGABRT 6 Core Abort signal from abort(3)
SIGFPE 8 Core Floating-point exception
SIGKILL 9 Term Kill signal
SIGSEGV 11 Core Invalid memory reference
SIGPIPE 13 Term Broken pipe: write to pipe with no
readers; see pipe(7)
SIGALRM 14 Term Timer signal from alarm(2)
SIGTERM 15 Term Termination signal
SIGUSR1 30,10,16 Term User-defined signal 1
SIGUSR2 31,12,17 Term User-defined signal 2
SIGCHLD 20,17,18 Ign Child stopped or terminated
SIGCONT 19,18,25 Cont Continue if stopped
SIGSTOP 17,19,23 Stop Stop process
SIGTSTP 18,20,24 Stop Stop typed at terminal
SIGTTIN 21,21,26 Stop Terminal input for background process
SIGTTOU 22,22,27 Stop Terminal output for background process