做什么

向进程发送信号——不只是"杀",是"通讯"。

实战

kill 1234                  # 默认发 SIGTERM(15,温柔结束)
kill -9 1234               # SIGKILL(强制,不可阻挡)
kill -HUP 1234             # SIGHUP(多数服务用来"重载配置")
kill -INT 1234             # SIGINT(同 Ctrl+C)
kill -STOP 1234            # 暂停(不能阻挡)
kill -CONT 1234            # 继续
kill -l                    # 看所有信号名 + 数字

常用信号速查

信号 数字 说明
SIGTERM 15 默认——温柔结束,让程序自己清理
SIGKILL 9 内核直接杀,不可阻挡
SIGHUP 1 挂起 / 多数 daemon 重载配置
SIGINT 2 中断(Ctrl+C)
SIGQUIT 3 退出 + core dump
SIGSTOP 19 暂停(不可阻挡)
SIGCONT 18 继续
SIGUSR1 10 用户自定义 1(应用层约定)
SIGUSR2 12 用户自定义 2

永远先 TERM,再 KILL

kill 1234                  # 先试温柔
sleep 5
kill -9 1234               # 不响应才强杀

kill -9 不让程序清理资源——可能留下不一致状态(脏数据、未关闭的锁、临时文件等)。只在 TERM 不响应时用

D 状态杀不掉

STAT = D(uninterruptible sleep)

进程在等磁盘 IO 时信号会被阻塞——kill -9 也没用。要等 IO 完成(或重启)。

给一组进程发信号

kill -- -<PGID>            # 整个进程组(前面的负号关键)

或用 killall / pkill(下一篇)按名字批量。

通过其他工具发信号

killall nginx              # 按命令名杀所有
pkill -f "myapp"           # 按命令行匹配

  • kill -1kill 1!前者发 SIGHUP,后者杀 PID 1(init 进程,会让系统挂)
  • kill -0 PID 检查进程是否存在(发 0 信号 = 探测)
  • kill -9 也杀不动的:
    • D 状态(IO 等待)
    • 内核线程(PID 在 [] 里的)
    • PID 1(init)