在日常办公中,自动化处理重复任务能省下不少时间。比如每天早上要从服务器拉取数据、生成报表、再发邮件通知团队。这些步骤如果手动操作,费时又容易出错。于是很多人会写个 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 的用法,能让自动化脚本更可靠。别再让“我以为它跑完了”成为背锅理由。