在日常使用Linux系统时,经常需要在终端里运行多个命令。有时候,后面的命令必须等前面的命令完全执行完才能开始,比如备份数据库之后再压缩文件,或者编译程序后进行安装。这时候就需要让bash脚本“停一下”,等任务真正结束。
用wait命令等待后台任务
如果你把一个耗时命令放到后台运行,比如下载一个大文件,可以加上&符号:
curl -o large-file.zip http://example.com/file.zip &
这样终端会立刻返回提示符,但你可能希望后续操作等它下完再执行。这时可以用wait命令:
curl -o large-file.zip http://example.com/file.zip &
wait
echo "下载完成,开始处理文件"
unzip large-file.zip
wait会暂停脚本,直到所有后台进程结束。如果你想只等某个特定进程,可以把它的PID保存下来:
curl -o data.tar.gz http://site.com/data.tar.gz &
pid=$!
wait $pid
echo "指定任务已完成"
同步执行默认就等待
其实大多数情况下不需要额外操作。普通命令不加&时,bash天然就会等它执行完才继续:
tar -czf backup.tar.gz /home/user/docs
echo "压缩已完成"
上面的例子中,echo一定是在打包完成后才输出的。这种串行执行是shell的默认行为,适合大多数场景。
检查命令是否成功完成
除了等待,有时你还想知道命令是不是顺利跑完了。可以通过检查退出状态码来判断:
ffmpeg -i input.mp4 output.avi
if [ $? -eq 0 ]; then
echo "转换成功"
else
echo "转换失败"
fi
$?保存上一个命令的退出码,0表示成功。这样可以根据结果决定下一步动作。
实际应用场景
假设你要部署一个小网站,流程是拉代码、安装依赖、重启服务。这三个步骤必须依次进行:
git pull origin main
npm install
sudo systemctl restart nginx
每一步都依赖前一步的结果。如果npm install还没装完就重启nginx,可能导致服务异常。bash在这里自动帮你“等待”,无需额外处理。
但如果你用了并行方式加快速度,比如同时处理多个日志文件:
process_log file1.log &
process_log file2.log &
process_log file3.log &
wait
echo "所有日志处理完毕"
这时候wait就是关键,确保三个处理都结束后才打印完成信息。