Ubuntu 20.04下unattended-upgrades无法通过cronjob启动的解决方法问询
你好,我看到你在Ubuntu 20.04里遇到了unattended-upgrades没法通过/etc/cron.daily/apt-compat这个定时任务启动的问题——核心原因就是脚本里那段检查systemd的逻辑直接让脚本退出了。咱们不用删/run/systemd/system目录,有几个可行的解决思路:
先理清楚问题根源
脚本里这段判断的初衷是:认为systemd环境下用systemd timer来执行更新更合理(它的随机调度能避免大家同时挤镜像源),但你更倾向于用cronjob触发,而且不想动/run/systemd/system这个有实际文件的目录,完全可以理解。
方法一:临时绕过判断(快速验证)
如果只是想先测试让cronjob触发一次,可以直接修改apt-compat脚本里的判断逻辑:
打开脚本:
sudo nano /etc/cron.daily/apt-compat
把原来的:
if [ -d /run/systemd/system ]; then exit 0 fi
改成:
if [ -d /run/systemd/system ] && false; then exit 0 fi
这样这个判断永远不会成立,脚本就会继续执行下去。不过要注意,系统后续更新可能会覆盖这个脚本,所以这是临时方案。
方法二:自定义cron任务(推荐,持久化)
既然核心执行命令/usr/lib/apt/apt.systemd.daily本身是正常的,咱们可以绕开apt-compat,直接创建自己的定时任务:
- 在
cron.daily目录下新建自定义脚本:
sudo nano /etc/cron.daily/my-unattended-upgrades
- 写入以下内容:
#!/bin/bash exec /usr/lib/apt/apt.systemd.daily
- 给脚本添加执行权限:
sudo chmod +x /etc/cron.daily/my-unattended-upgrades
这样每天cron会自动执行这个自定义脚本,直接触发更新,完全不受原apt-compat的判断逻辑影响,而且不会被系统更新覆盖。
方法三:修改判断逻辑为标志文件控制(持久化)
如果想保留原apt-compat脚本的逻辑,只是让它跳过退出判断,可以把判断改成依赖一个自定义标志文件:
- 编辑
apt-compat脚本:
sudo nano /etc/cron.daily/apt-compat
- 将原来的判断替换为:
# 仅当存在systemd目录且不存在强制cron更新的标志文件时退出 if [ -d /run/systemd/system ] && [ ! -f /force-cron-apt-upgrade ]; then exit 0 fi
- 创建标志文件:
sudo touch /force-cron-apt-upgrade
这样脚本检测到标志文件存在,就会继续执行cron触发的更新。除非系统更新完全替换apt-compat脚本,否则这个修改会一直生效。
你已经验证过核心更新命令是正常的,所以上面任意一种方法都能解决你的问题,根据自己的需求选就行~
备注:内容来源于stack exchange,提问作者Uwe Bartels

