核心 · Key Idea
一句话:Linux 上一切运行中的程序都是进程;进程间靠信号通信;kill 不是动词,是「send signal」。SIGTERM (15) 让进程自己优雅退;SIGKILL (9) 内核直接收尸。
是什么#
进程 = 一个程序的运行实例
↓
PID(进程 ID)
PPID(父进程 ID)
UID / GID(身份)
状态(R / S / D / Z / T)
每个进程都有一个父进程;init / systemd(PID 1)是所有进程的祖先。
打个比方#
打个比方 · Analogy
进程像正在演出的演员。
SIGTERM 像下班铃声:「请收尾下班」 —— 演员保存好东西再走。
SIGKILL 像直接拉电闸:演出立刻黑屏,未保存的全没。
僵尸进程像演员已经走了但工资单没结:父进程没去签字结清。
关键概念#
PID进程 ID
唯一编号。pid 1 是 init / systemd。
状态ps STAT 列
R 跑 / S 睡 / D 不可中断(IO 中)/ Z 僵尸 / T 暂停。
信号Signal
OS 给进程的异步通知。常用 1 HUP、2 INT、9 KILL、15 TERM。
孤儿进程Orphan
父进程死了,被 init/systemd 接管。无害。
僵尸进程Zombie / defunct
子进程已结束,但父进程没 wait 收尸。资源占用极小,但**多了说明父进程有 bug**。
守护进程Daemon
脱离终端长期运行的后台进程,传统上以 `d` 结尾(sshd / nginxd)。
怎么工作#
SIGKILL(9)和 SIGSTOP 是唯二无法被进程捕获 / 屏蔽的信号。
实操要点#
ps aux | grep xxx或pgrep -fa xxx找进程。top/htop/btop:实时查看 CPU / 内存。- 优雅停服务永远先
SIGTERM:默认kill PID就是 15。等几秒后再kill -9。 - 直接 -9 的代价:连接没关、缓冲数据丢、临时文件没清 —— 数据库尤其忌讳。
- 杀进程组:
kill -- -PGID或pkill -P PID,避免遗漏子进程。 SIGHUP(1)通常意为「重读配置」:nginx / sshd 等约定如此。- 僵尸不能再被 kill:只能找到 PPID,让父进程退出(init 接管自动收尸)。
strace -p PID看进程在做什么系统调用,调试卡死神器。
易混点#
kill (TERM)
给进程**一个机会自我清理**。
可被 ignore(极少数)。
可被 ignore(极少数)。
kill -9 (KILL)
内核**强制**收尸。
不可阻挡,可能丢数据。
不可阻挡,可能丢数据。