Ubuntu 16.04中如何终止子脚本b.sh且让父脚本a.sh完成运行
解决Ubuntu 16.04中终止子脚本b.sh但保留父脚本a.sh运行的问题
首先得说清楚你之前踩的坑:用pkill -f b.sh会把a.sh也干掉,大概率是因为pkill -f会匹配所有命令行里包含"b.sh"的进程——如果你的a.sh进程的命令行(比如运行./a.sh时的进程信息)里刚好能匹配到"b.sh"(或者某些特殊场景下,比如交互式shell的历史命令带了b.sh),就会误杀a.sh。更稳妥的方式是记录b.sh的PID,精准杀掉它,而不是模糊匹配。
下面给你具体的实现步骤:
1. 确认b.sh的调用方式
首先要确保a.sh是把b.sh作为独立子进程调用的,绝对不能用source b.sh或者. b.sh(这两种方式会让b.sh和a.sh共用同一个进程,根本没法单独终止b.sh)。正确的调用方式是后台运行b.sh:
./b.sh &
2. 修改a.sh的代码
用$!变量可以获取刚启动的后台进程的PID,然后用这个PID精准杀掉b.sh,不会影响a.sh。示例a.sh代码如下:
#!/bin/bash # 启动b.sh并立刻记录它的PID ./b.sh & BANANA_PID=$! # 这里模拟等待一段时间,确保在b.sh输出"Bananas"前执行终止操作 # 你可以根据b.sh的实际逻辑调整这个等待时间,或者用其他判断条件(比如检查日志、文件状态) sleep 2 # 精准终止b.sh进程 kill $BANANA_PID # 继续执行a.sh的后续逻辑 echo "a is still running"
3. 测试用的b.sh示例
假设你的b.sh是这样的(模拟先执行一些操作再输出"Bananas"):
#!/bin/bash echo "b.sh is starting..." sleep 5 # 模拟耗时操作,5秒后才输出Bananas echo "Bananas"
4. 运行验证
先给两个脚本加执行权限:
chmod +x a.sh b.sh
然后运行a.sh:
./a.sh
你会看到输出:
b.sh is starting... a is still running
b.sh被提前终止,不会输出"Bananas",而a.sh正常跑完最后一句,完全符合你的需求。
补充:如果b.sh不肯乖乖终止怎么办?
如果遇到b.sh无法被默认的kill命令终止的情况,可以用强制终止信号:
kill -9 $BANANA_PID
不过优先用默认的SIGTERM信号(也就是不带参数的kill),给进程正常清理资源的机会。
内容的提问来源于stack exchange,提问作者speld_rwong
相关产品推荐
相关产品推荐

