信号:能抓住的,和抓不住的
一句话总结
信号是发送给进程的通知,只有 SIGKILL 与 SIGSTOP 不能捕获、阻塞或忽略。正常停止应先发送 SIGTERM,宽限期后才使用 SIGKILL。
进程“不退出”可能是正在清理、处于不可中断的 D 状态、已经成为僵尸,或容器 PID 1 未转发信号。僵尸已结束,应由父进程回收;D 状态须修复底层 I/O。容器应使用 exec 形式或 init 正确转发和回收。
强制终止会跳过缓冲区刷新、锁释放和事务清理。服务收到终止信号后应停止接收新请求、完成在途工作,再退出。诊断时先检查捕获/忽略掩码、进程状态和父子关系。
原文中的命令与标识符
cat /proc/<pid>/status | grep -E 'SigBlk|SigIgn|SigCgt'
ps -eo pid,stat,wchan:20,cmd | awk '$2 ~ /D/'
timeout -s TERM -k 30s 5m ./worker # TERM 뒤 30초 안에 안 끝나면 KILL
kill
kill -9
docker stop
TimeoutStopSec
timeout -k 10 30 명령
wait
128 + 시그널 번호
CMD myapp
/bin/sh -c
CMD ["myapp"]
pkill -f
pgrep -a -f
kill -9 -1
sleep 300
sleep 300 & wait $!
kill
SIGTERM
SIGKILL
ps
D
Z
--init
tini
SIGTERM
SIGINT
kill -- -<pgid>