在Linux系统中,关闭(终止)正在运行的 .sh
文件(Shell脚本)需要通过系统命令中断其进程,以下是详细操作步骤及方法:
理解进程终止原理
.sh
文件本身不是“服务”,而是通过Shell解释器(如/bin/bash
)运行的脚本,关闭操作实际是终止其对应的进程,根据脚本运行状态选择不同方法:
终止前台运行的脚本
若脚本正在终端前台运行(例如通过 ./test.sh
启动):
-
快捷键终止:
按下Ctrl + C
组合键,立即中断脚本。# 示例:运行后按 Ctrl+C $ ./test.sh ^C # 脚本被强制终止
-
快捷键暂停:
若需临时暂停(非终止),按Ctrl + Z
将脚本挂起到后台,再手动终止:$ ./test.sh ^Z # 暂停脚本,返回终端 [1]+ Stopped ./test.sh $ jobs -l # 查看后台任务(显示进程ID) [1]+ 12345 Stopped ./test.sh $ kill -9 12345 # 强制终止该进程
终止后台运行的脚本
若脚本在后台启动(./test.sh &
):
-
通过
jobs
查找任务ID:$ jobs -l # 列出后台任务及进程ID [1]- 23456 Running ./test.sh &
-
终止指定任务:
$ kill %1 # 终止任务ID为1的后台任务 # 或 $ kill 23456 # 直接终止进程ID
通过进程名/ID全局终止
若脚本未在当前终端运行,或需精确终止:
-
查找进程ID(PID):
使用ps
或pgrep
定位进程:$ ps aux | grep test.sh # 过滤脚本进程 # 输出示例:user 34567 0.0 0.1 12345 6780 pts/0 S 10:00 0:00 /bin/bash ./test.sh $ pgrep -f test.sh # 直接获取PID 34567
-
终止进程:
- 正常终止(允许资源清理):
$ kill 34567 # 发送SIGTERM信号
- 强制终止(立即结束,可能丢失数据):
$ kill -9 34567 # 发送SIGKILL信号
- 正常终止(允许资源清理):
-
按进程名批量终止:
$ pkill -f test.sh # 终止所有匹配"test.sh"的进程 # 或 $ killall -9 test.sh # 强制终止同名进程(需安装killall)
特殊情况处理
-
脚本卡死无响应:
优先用kill -9 PID
强制终止,再检查脚本逻辑。 -
脚本产生子进程:
使用pkill -P PID
终止子进程,或通过进程组终止:$ kill -- -PGID # 注意负号表示进程组ID
注意事项
- 数据安全:
kill -9
是强制终止,可能导致未保存数据丢失,优先尝试kill PID
(默认SIGTERM)。 - 权限要求:
普通用户只能终止自己的进程,系统级脚本需sudo
提权。 - 确认进程状态:
终止后执行ps aux | grep test.sh
确认进程已退出。
总结步骤
- 定位脚本进程 →
ps aux | grep 脚本名
- 根据运行状态选择方法 → 前台(
Ctrl+C
)、后台(jobs
)、全局(pkill
) - 发送终止信号 →
kill [信号] PID
- 验证结果 → 再次检查进程列表
引用说明基于Linux内核标准进程管理机制,参考《Linux命令行与Shell脚本编程大全》及GNU Coreutils文档,操作命令兼容主流Linux发行版(Ubuntu/CentOS/Debian等)。
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/24208.html