系统学习 macOS 学习路径:从 BSD 文件命令到系统、网络与开发维护

kill

向进程发送信号,默认 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

易错点与排错

相关命令

参考链接

读完自测

合上页面,先回答,再展开对照。

  1. TERM 和 KILL 的关键区别是什么?为什么不应默认用 KILL?
  2. kill -0 1234 返回 1 可能有哪些原因?它发出了什么信号?
  3. 为什么杀了 launchd 管理的服务后它又出现了?正确做法是什么?
答案
  1. TERM 可被进程捕获并清理后退出,KILL 由内核强制终止、无法清理;默认 KILL 可能导致数据损坏或残留锁。
  2. 进程不存在,或当前用户无权向它发信号;-0 不发送任何信号,只做存在性和权限检查。
  3. 服务配置了 KeepAlive 或由 launchd 按需拉起;应 launchctl bootout 卸载,或修改 plist 后重新加载,而不是反复杀进程。
微信小程序码:扫码打开命令速查小程序

小程序版

微信扫码,随时查命令