首页 > Sysadmin > 正文

Linux 停止脚本的几种方法

huyuanwen 2026-11-04 Sysadmin

前台用 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

知道进程名时不必查 PID[5][6]:

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 状态不可中断进程的恢复。

参考资料

文中主要命令已在 WSL Ubuntu(24.04)实测并核对其在 Debian 系与通用发行版的文档口径。