Linux/BSD环境下如何等待后台远程目录挂载任务完成?
Linux/BSD环境下如何等待后台远程目录挂载任务完成?
兄弟,我太懂你这种挂载慢拖后腿的烦恼!本来想后台挂载省时间,结果最近挂载速度掉链子,最后一步直接失败,fg还报错说没作业控制,确实头疼!给你几个靠谱的解决办法,适配你的zsh/macOS环境,bash也能用:
方法一:记录后台进程PID,用wait命令等待完成
这是最直接的脚本友好方案,完全不需要作业控制,比fg靠谱多了。
当你后台启动挂载命令时,立刻把它的PID存下来:
# 启动挂载命令并后台运行,记录进程PID your_mount_command & MOUNT_PID=$!
然后你就可以放心执行那些不需要远程磁盘的操作,等轮到需要用挂载目录的步骤时,用wait命令等着这个挂载进程结束:
# 等待挂载任务完成 wait $MOUNT_PID # 可选:检查挂载是否成功 if [ $? -ne 0 ]; then echo "远程目录挂载失败!" >&2 exit 1 fi
wait是shell内置命令,不管是zsh还是bash都支持,而且在非交互式脚本环境下完美运行,不会出现“no job control”的问题。
方法二:双重保险——先等进程结束,再检查文件就绪
有些网络挂载(比如NFS、SMB)可能会出现进程已经退出,但实际文件系统还没完全就绪的情况,这时候可以在wait之后再加个循环检查已知的远程文件/目录:
wait $MOUNT_PID # 检查远程挂载点下的某个已知文件是否存在 KNOWN_FILE="/mnt/remote/your_known_file" while [ ! -f "$KNOWN_FILE" ]; do echo "等待远程文件就绪..." sleep 1 done
这种方法比单纯等进程更稳妥,能确保你真正能访问到远程文件再继续执行后续步骤。
为什么fg不行?
你遇到的“no job control in this shell”报错,是因为脚本默认运行在非交互式shell里,这种环境下默认没有作业控制功能(作业控制是给交互式终端用的),所以fg、bg这些命令没法用。而wait就是专门为脚本设计的后台进程等待工具,完全避开了这个问题。
如果实在想用csh的话,也可以用wait %1(假设挂载是第一个后台作业),但用PID的方法在各种shell里兼容性更好,更推荐。
备注:内容来源于stack exchange,提问作者WGroleau
相关产品推荐
相关产品推荐

