kill 命令用于向进程发送信号,实现终止、暂停、继续等操作。虽然名字叫 kill,但它不只是用来终止进程,还可以发送各种控制信号。
信号是进程间通信的一种方式。当进程收到信号时,会执行相应的操作。每个信号都有编号和名称,进程可以选择忽略某些信号或自定义处理方式。
查看所有信号:
kill -l
常用信号:
| 编号 | 名称 | 含义 |
|---|---|---|
| 1 | SIGHUP | 挂起,重新加载配置 |
| 2 | SIGINT | 中断,Ctrl+C |
| 9 | SIGKILL | 强制终止 |
| 15 | SIGTERM | 正常终止(默认) |
| 18 | SIGCONT | 继续 |
| 19 | SIGSTOP | 暂停 |
| 20 | SIGTSTP | 终端暂停,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 nginx
killall -9 python
killall -u user nginx
-u 按用户过滤。
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 值范围是 -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)
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 进程收养继续运行。