进程控制 kill

kill 命令用于向进程发送信号,实现终止、暂停、继续等操作。虽然名字叫 kill,但它不只是用来终止进程,还可以发送各种控制信号。

信号的概念

信号是进程间通信的一种方式。当进程收到信号时,会执行相应的操作。每个信号都有编号和名称,进程可以选择忽略某些信号或自定义处理方式。

常用信号

查看所有信号:

kill -l

常用信号:

编号名称含义
1SIGHUP挂起,重新加载配置
2SIGINT中断,Ctrl+C
9SIGKILL强制终止
15SIGTERM正常终止(默认)
18SIGCONT继续
19SIGSTOP暂停
20SIGTSTP终端暂停,Ctrl+Z

基本用法

正常终止进程

kill 1234
kill -15 1234
kill -TERM 1234

默认发送 SIGTERM 信号,进程可以捕获并做清理工作后退出。

强制终止进程

kill -9 1234
kill -KILL 1234

SIGKILL 信号不能被捕获或忽略,进程会立即终止,可能造成数据丢失。应该作为最后手段。

重新加载配置

kill -HUP 1234
kill -1 1234

许多守护进程收到 SIGHUP 后会重新读取配置文件。

暂停和继续进程

kill -STOP 1234
kill -CONT 1234

终止多个进程

kill 1234 5678 9012

killall 命令

killall 按进程名终止进程:

killall nginx
killall -9 python
killall -u user nginx

-u 按用户过滤。

pkill 命令

pkill 支持更灵活的匹配:

pkill nginx
pkill -f "python script.py"
pkill -u root
pkill -t pts/0
  • -f 匹配完整命令行
  • -u 按用户
  • -t 按终端

确认后终止

pkill -i nginx
killall -i nginx

-i 交互模式,终止前确认。

进程优先级

nice 值

进程的 nice 值范围是 -20 到 19,值越低优先级越高。默认是 0。

启动时设置优先级

nice -n 10 ./script.sh
nice -n -5 ./important_task.sh

普通用户只能设置正值(降低优先级),root 可以设置负值。

修改运行中进程的优先级

renice -n 5 -p 1234
renice -n -5 -p 1234
renice -n 10 -u username

按用户修改所有进程的优先级:

renice +5 -u www-data

查看进程优先级

ps -eo pid,ni,comm
top

NI 列显示 nice 值。

实用示例

终止僵尸进程

僵尸进程已经终止,只是父进程还没回收。通常需要终止父进程:

ps aux | awk '$8 ~ /Z/ {print $2}'
kill -9 $(ps -A -ostat,ppid | awk '/^[zZ]/ {print $2}')

终止占用端口的进程

lsof -i :8080
kill -9 $(lsof -t -i:8080)

终止所有 Python 进程

pkill python
killall python

安全终止服务

kill -TERM $(cat /var/run/nginx.pid)
kill -HUP $(cat /var/run/nginx.pid)

限制进程优先级

nice -n 19 tar -czf backup.tar.gz /large/dir
renice +10 -p $(pgrep backup_script)

查找并终止失控进程

ps aux --sort=-%cpu | head -5
kill -9 $(ps aux --sort=-%cpu | head -2 | tail -1 | awk '{print $2}')

注意事项

SIGKILL 的风险:强制终止可能导致数据丢失,数据库损坏。优先使用 SIGTERM。

僵尸进程:僵尸进程无法用 kill 终止,需要终止父进程或等待父进程回收。

权限问题:普通用户只能终止自己的进程,root 可以终止任何进程。

进程组:终止父进程时,子进程可能被 init 进程收养继续运行。

小结

  • kill 向进程发送信号,默认是 SIGTERM
  • SIGTERM 可以被捕获,SIGKILL 不能
  • killall 和 pkill 按名称终止进程
  • nice 和 renice 调整进程优先级
  • 优先使用 SIGTERM,SIGKILL 作为最后手段