向进程发送信号,默认 TERM,用于优雅停止、重载或强制结束。
kill 是 shell 内建命令,按 PID 发信号。默认 TERM(15)让进程自行清理后退出;KILL(9)由内核直接终止,进程没有机会收尾;HUP(1)常让守护进程重读配置;STOP/CONT 暂停和继续。脚本里优先写信号名,因为 macOS 与 Linux 的编号不同,例如 STOP 在 macOS 是 17、Linux 是 19。
边界:kill 只能操作有权限的进程,其他用户的进程要 sudo。launchd 拉起的服务被杀后通常会被重新拉起,停服务应改 launchctl 配置,而不是反复杀。TERM 可能被忽略或阻塞,等几秒再考虑 KILL。
# 1. 先确认 PID 对应的命令,再发 TERM
% ps -p 1234 -o pid,user,command
% kill -TERM 1234
# 2. 只检查进程是否存在、有无权限,不发信号
% kill -0 1234; echo $?
# 3. 让 mDNSResponder 重读配置并刷新 DNS 缓存
% sudo kill -HUP "$(pgrep -x mDNSResponder)"
# 4. 向整个进程组发信号;负号是组 ID,会波及同组子进程
% ps -o pid,pgid,command -p 1234
% sudo kill -TERM -1234
# 5. 暂停一个吃 CPU 的进程,排查后再继续
% kill -STOP 1234
% kill -CONT 1234
# 6. 查看当前平台支持的信号名,不要背编号
% kill -l
kill -9,进程无法删除临时文件、释放锁、写完日志,可能丢数据;先 TERM,等待并确认后再 KILL。ps -p PID -o command 确认身份,脚本里尤其要防止误杀。kill -TERM -1234 会连带 shell、子进程一起结束;在交互终端里误用可能把自己踢掉。-9 可移植性差,写 -KILL、-TERM 更稳。Operation not permitted;需要 sudo,但 SIP 保护的核心进程(如 kernel_task)仍然杀不掉。KeepAlive 时会自动重启,看到的“杀不死”其实是重启;用 launchctl print 确认,再 bootout 或改配置。killall — 按进程名批量发信号。ps、top — 找到 PID 并确认进程身份。launchctl — 停止或重启 launchd 管理的服务。kill、信号速查 — 对照信号语义。合上页面,先回答,再展开对照。
TERM 和 KILL 的关键区别是什么?为什么不应默认用 KILL?kill -0 1234 返回 1 可能有哪些原因?它发出了什么信号?TERM 可被进程捕获并清理后退出,KILL 由内核强制终止、无法清理;默认 KILL 可能导致数据损坏或残留锁。-0 不发送任何信号,只做存在性和权限检查。KeepAlive 或由 launchd 按需拉起;应 launchctl bootout 卸载,或修改 plist 后重新加载,而不是反复杀进程。
小程序版
微信扫码,随时查命令