前台用 Ctrl+C,后台用 jobs/kill,按名用 pkill/killall,自动限时用 timeout。kill 默认发送 TERM 信号,进程可安装处理函数做清理后再退出[1][2]。
TL;DR:前台 Ctrl+C;后台 jobs + kill %n;知道 PID 用 kill/kill -9;按名字用 pkill/killall;限时用 timeout;服务用 systemctl stop。
一、先找到进程
停之前先确认目标,避免误杀:
ps -ef | grep myscript.sh
pgrep -af myscript
ps 列出进程,pgrep -a 同时显示命令行[3]。
二、前台脚本:Ctrl+C
终端前台运行的脚本,按 Ctrl+C 发送 SIGINT,通常直接中断。脚本若需优雅退出,可在脚本内用 trap 捕获 TERM/INT:trap 'echo "收到终止信号,清理中"; exit 0' TERM INT。
三、后台任务:jobs 与 kill %n
用 & 启动的后台任务,shell 会记录作业号。用 jobs 查看,kill %作业号 终止[4]:
jobs -l
kill %1
%1 表示作业号 1,不是 PID。作业已脱离当前 shell(如 nohup)时,jobs 看不到,改用 PID 方式。
四、按 PID 停止:kill 与 kill -9
默认发送 SIGTERM,允许进程清理;进程不响应时再用 SIGKILL[1][2]:
kill <PID>
kill -9 <PID>
先 kill,等待几秒;仍存活再 kill -9。SIGKILL 无法被捕获或忽略,进程没有清理机会。
五、按名称停止:pkill 与 killall
pkill -f myscript.sh
killall myscript.sh
pkill -f 按完整命令行匹配,可能误匹配包含该字符串的 shell 命令,使用前用 pgrep -af 先确认。killall 按进程名(comm)精确匹配,更稳妥。
六、自动限时:timeout
运行时间不可控的脚本,用 timeout 自动终止[7]:
timeout 300 ./myscript.sh
超时后默认发送 TERM;加 -s KILL 可强制 SIGKILL。退出码 124 表示超时终止。
七、systemd 服务:systemctl stop
由 systemd 管理的脚本/服务,用 systemctl 停止,避免直接 kill 留下僵尸[8]:
由 systemd 管理的脚本/服务,用 systemctl 停止,避免直接 kill 留下僵尸[8]:systemctl stop myservice.service;systemctl is-active myservice.service 可确认状态。nohup 启动的进程忽略 SIGHUP,终端关闭后仍运行,需按 PID 停止[9]:nohup ./myscript.sh > out.log 2>&1 &、echo $! > myscript.pid,停止时 kill "$(cat myscript.pid)"。screen/tmux 会话内的进程,先 screen -r/tmux attach 进入再 Ctrl+C,或 screen -X -S <name> quit。
回滚
停止操作本身不可逆;若误停服务,用 systemctl start <unit> 或重新运行脚本恢复。建议执行破坏性 kill 前先 ps/pgrep 确认目标。
排错速查
| 现象 | 原因 | 处理 |
|---|---|---|
kill: (PID) - No such process |
进程已退出或 PID 错误 | 重新 ps/pgrep 确认 |
Operation not permitted |
权限不足 | 用 sudo 或切换到进程所有者 |
pkill 误杀自身 shell |
-f 匹配到命令行 |
先 pgrep -af 确认,改用 killall |
| 进程停不掉 | 忽略 TERM 或 D 状态 | kill -9;D 状态需等 I/O 完成 |
timeout 退出码 124 |
超时被终止 | 增加时限或优化脚本 |
实测与局限性
- 实测环境:WSL2 Ubuntu 24.04.4 LTS,Bash 5.2.21,procps-ng(kill/pkill/killall/ps),coreutils(timeout/nohup)。
- 已验证:SIGTERM 优雅退出(trap 生效)、
kill -9立即终止、killall按名终止、timeout超时退出码 124、nohup进程可按 PID 终止。 - 未覆盖:真实 systemd 服务管理(WSL 默认无 systemd 或需开启)、screen/tmux 会话操作、跨容器/命名空间进程、D 状态不可中断进程的恢复。
参考资料
- [1] kill(1) – Linux manual page(man7-kill)
- [2] signal(7) – Linux manual page(man7-signal)
- [3] ps(1) – Linux manual page(man7-ps)
- [4] Job Control (Bash Reference Manual)(bash-jobcontrol)
- [5] pkill(1) – Linux manual page(man7-pkill)
- [6] killall(1) – Linux manual page(man7-killall)
- [7] timeout(1) – Linux manual page(man7-timeout)
- [8] systemctl(1) – Linux manual page(man7-systemctl)
- [9] nohup(1) – Linux manual page(man7-nohup)
文中主要命令已在 WSL Ubuntu(24.04)实测并核对其在 Debian 系与通用发行版的文档口径。