如何让Supervisord等待挂载点就绪后再启动任务?
如何让Supervisord等待挂载点就绪后再启动任务?
我太懂这种困扰了——USB硬盘启动慢得离谱,提前启动依赖它的任务不仅白跑还一堆报错,完全没必要。可惜Supervisord本身确实没有像systemd那样直接的After=*.mount配置项,不过咱们可以用几个变通方法来实现类似的效果:
用前置检查脚本包装你的任务命令
这是最直接简单的办法,写个小脚本先循环检查挂载点状态,等挂载就绪了再启动实际任务。比如你可以创建一个wait_for_mount.sh脚本:#!/bin/bash MOUNT_POINT="/mnt/your_usb_hdd" # 替换成你的挂载点路径 # 循环检查挂载点是否已挂载 while true; do # 通过/proc/mounts检查挂载状态,避免误判 if grep -qs "$MOUNT_POINT" /proc/mounts; then echo "挂载点已就绪,启动任务..." exec "$@" # 执行传入的实际任务命令,用exec替换当前进程,确保信号能正确传递 fi echo "挂载点还没准备好,5秒后再检查..." sleep 5 done给脚本加执行权限:
chmod +x /path/to/wait_for_mount.sh,然后修改Supervisord的任务配置:[program:your_dependent_task] command=/path/to/wait_for_mount.sh /path/to/your/actual/task_executable autorestart=true # 其他配置如user、stdout_logfile等保持不变这样每次Supervisord尝试启动任务时,都会先进入等待挂载的循环,直到挂载点就绪才会真正启动你的任务。如果之后挂载掉了,你的任务大概率会因为无法访问存储而终止,Supervisord重启时又会回到等待挂载的状态,刚好符合你说的“挂载消失后至少不会直接重启任务”的需求。
可选:给等待加超时限制
要是怕硬盘出问题一直等下去,也可以给脚本加个超时逻辑,比如最多等5分钟(60次检查):#!/bin/bash MOUNT_POINT="/mnt/your_usb_hdd" MAX_WAIT=60 # 最多检查60次,每次5秒就是5分钟 COUNT=0 while [ $COUNT -lt $MAX_WAIT ]; do if grep -qs "$MOUNT_POINT" /proc/mounts; then echo "挂载点已就绪,启动任务..." exec "$@" fi COUNT=$((COUNT+1)) echo "挂载点未就绪,第$COUNT次检查,5秒后重试..." sleep 5 done echo "等待超时,挂载点仍未就绪,启动失败" exit 1这样超时后脚本会退出,Supervisord如果配置了
autorestart,还是会重试,但至少不会无限等下去。
备注:内容来源于stack exchange,提问作者Eva4684
相关产品推荐
相关产品推荐

