Ubuntu服务器重启时crontab更新脚本偶发失败,提示域名解析错误求助
解决重启时自动更新脚本偶发网络失败的问题
你的判断完全精准——@reboot触发的crontab任务会在系统启动早期就运行,这时候网络服务(尤其是DNS解析模块)往往还没完全初始化完毕,就会出现这种偶发的Temporary failure resolving 'security.ubuntu.com'错误。下面给你几个靠谱的解决办法,按可靠性优先级排序:
1. 给脚本加网络就绪等待逻辑(最灵活)
在更新脚本开头加入一段循环检测,等网络稳定能正常解析域名后,再执行更新命令。比如可以直接检测Ubuntu安全源的连通性:
修改后的/home/shendric/update.sh:
#!/bin/bash # 等待网络就绪:最多重试30次,每次间隔10秒(总计5分钟) MAX_RETRIES=30 RETRY_INTERVAL=10 for ((i=1; i<=MAX_RETRIES; i++)); do # 尝试解析security.ubuntu.com,成功则跳出循环 if nslookup security.ubuntu.com > /dev/null 2>&1; then echo "$(date): 网络已就绪,开始执行更新" >> /var/log/update_script.log break fi echo "$(date): 网络未就绪,第${i}次重试(等待${RETRY_INTERVAL}秒)" >> /var/log/update_script.log sleep $RETRY_INTERVAL done # 如果超过最大重试次数,记录错误并退出 if ((i > MAX_RETRIES)); then echo "$(date): 网络超时,无法执行更新" >> /var/log/update_script.log exit 1 fi # 执行更新命令 apt-get update -y | tee -a /var/log/update_script.log apt-get upgrade -y | tee -a /var/log/update_script.log echo "$(date): 更新脚本执行完成" >> /var/log/update_script.log
记得确保脚本有执行权限:chmod +x /home/shendric/update.sh
2. 改用systemd服务(最可靠)
systemd支持配置服务依赖,可以明确让脚本在网络完全启动后再运行,比crontab的@reboot可控性强得多。
步骤1:创建systemd服务文件
新建/etc/systemd/system/post-update.service文件,内容如下:
[Unit] Description=Post Reboot Package Update After=network-online.target Wants=network-online.target [Service] Type=oneshot ExecStart=/home/shendric/update.sh StandardOutput=append:/var/log/update_script.log StandardError=append:/var/log/update_script.log [Install] WantedBy=multi-user.target
步骤2:启用服务
执行以下命令让服务开机自动运行:
sudo systemctl daemon-reload sudo systemctl enable post-update.service
这样系统会在network-online.target(网络完全就绪的标志)之后启动你的更新脚本,彻底规避网络未就绪的问题。
3. 给crontab任务加延迟(最简单但最不可靠)
如果不想改脚本或配置systemd,可以临时给crontab任务加个固定延迟,比如等待60秒再执行:
@reboot sleep 60 && /home/shendric/update.sh
但这个方法的局限性很明显:不同机器的网络启动时间差异大,60秒可能在某些机器上不够,某些机器上又纯浪费时间,只适合临时测试用。
内容的提问来源于stack exchange,提问作者Simon Hendrickx
相关产品推荐
相关产品推荐

