You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 03:26:11