每日智识
柔彩主题三 · 更轻盈的阅读体验

Bash脚本中如何优雅地等待命令执行完成

发布时间:2026-01-14 13:11:40 阅读:260 次

在日常办公中,自动化处理重复任务能省下不少时间。比如每天早上要从服务器拉取数据、生成报表、再发邮件通知团队。这些步骤如果手动操作,费时又容易出错。于是很多人会写个 Bash 脚本来自动跑流程。

但问题来了:假如第一个命令还没跑完,第二个命令就急着开始,结果数据不全或者文件没生成,整个流程就卡住了。这时候就得让脚本“等一等”,等前一个命令真正执行完了再继续。

最简单的等待:顺序执行

Bash 默认就是顺序执行命令的。你在脚本里写几行命令,它会一条一条走,前一条不结束,后一条不会开始。

echo "开始下载数据..."
sleep 3
echo "数据下载完成"
echo "开始生成报表..."

上面这个脚本里,sleep 3 模拟了一个耗时操作。第三行的 echo 不会提前执行,因为 Bash 天然就会等 sleep 完成。

需要并行时怎么办?

有时候你希望多个任务同时跑,比如同时从两个接口拉数据,谁先回来先处理谁。这时你会用到后台运行 &。

fetch_data_from_api1 &
fetch_data_from_api2 &

但这样写完就继续往下走,可能后续命令还没等数据拉完就开始处理,结果为空。这时候就得用 wait 命令。

wait:专治各种“等等”

只要你在后台启动了进程,就可以用 wait 等它们全部结束。

echo "并行拉取数据..."
python fetch_user.py &
python fetch_order.py &

wait

echo "所有数据已就位,开始合并分析"
python analyze.py

这里的 wait 会阻塞脚本,直到所有后台任务完成。就像你在地铁站等所有人下车后再关门发车。

只等特定任务?带上进程ID

如果你只想等某个特定任务,可以把它的进程 ID 记下来,然后指定 wait。

python long_task.py &
pid=$!

# 先做点别的
echo "正在处理其他事..."
sleep 2

# 回头再等那个任务
wait $pid
echo "长任务终于完成了"

$! 是上一个后台命令的进程 ID。这样你可以灵活控制等待时机,不耽误其他工作。

实际场景:定时备份加通知

假设你要写个脚本,每天备份数据库,上传到云存储,最后发个企业微信通知。这三个步骤必须按顺序来。

#!/bin/bash

echo "【$(date)】开始备份数据库"
mysqldump -u root mydb > backup.sql

echo "上传到云端..."
./upload.sh backup.sql &
upload_pid=$!

# 同时生成本次备份报告
./gen_report.sh &
report_pid=$!

# 等上传和报告都完成
wait $upload_pid
wait $report_pid

# 最后发通知
curl -X POST https://qyapi.weixin.qq.com/... -d '{"text": "备份已完成"}'

echo "任务全部完成"

这个脚本能并发处理上传和报告生成,节省时间,又确保最后的通知不会漏发。

掌握 wait 的用法,能让自动化脚本更可靠。别再让“我以为它跑完了”成为背锅理由。