我设置了root
cron 来自动运行apt-get upgrade
。很简单。下面是具体行:
@daily (apt-get update && apt-get -y upgrade) 2>&1 > /var/log/tmp.log
但是,我一直在关注日志文件的输出,它总是停在输出中通常(即没有-y
)询问的部分Do you want to continue [Y/n]?
。我确认它没有继续运行,因为apt-get upgrade
仍然显示需要更新的包。为什么它在此时停止?我该如何让它继续?
编辑:
### apt-get update output ###
Building dependency tree...
Reading state information...
The following packages have been kept back:
linux-generic linux-headers-generic linux-image-generic
The following packages will be upgraded:
file libgudev-1.0-0 libmagic1 libpam-systemd libsystemd-daemon0
libsystemd-login0 libudev1 linux-libc-dev openssh-client openssh-server
systemd-services udev
12 upgraded, 0 newly installed, 0 to remove and 3 not upgraded.
Need to get 0 B/3,412 kB of archives.
After this operation, 16.4 kB of additional disk space will be used.
修改 2:我缩短了命令以尝试找出问题。我还阅读了man apt-get
。我找到了一个可能需要通过的新标志,剩下:
@daily apt-get -y --force-yes upgrade 2>&1 > /var/log/tmp.log
不幸的是,我仍然得到相同的结果:(
答案1
tldr;不要假设任何中的环境变量cron
(包括PATH
)。
几天后,我意识到我是个白痴,把它放2>&1
错了地方。把它放在日志文件名后面后,它给了我导致问题的错误:
dpkg: warning: 'ldconfig' not found in PATH or not executable
dpkg: warning: 'start-stop-daemon' not found in PATH or not executable
dpkg: error: 2 expected programs not found in PATH or not executable
Note: root's PATH should usually contain /usr/local/sbin, /usr/sbin and /sbin
有了这个新信息,我最后成立另一篇帖子有同样的问题。事实证明,cron
的环境变量非常有限。这是由于 的旧攻击cron
利用了上述变量。这意味着PATH
变量永远不会加载(如上错误所示),因此apt-get upgrade
无法运行依赖于 的一些命令。可以通过PATH
在 中手动设置来解决这个问题cron
。
还有一些其他错误与需要debconf
控制 tty 有关。这不会阻止命令运行,但可以通过设置DEBIAN_FRONTEND
环境变量来抑制这些错误cron
。
以下是它的全部荣耀:
PATH=/usr/bin:/bin:/usr/sbin:/sbin
DEBIAN_FRONTEND=noninteractive
@daily apt-get -y upgrade > /var/log/tmp.log 2>&1
答案2
哪些软件包尚未更新?
您确定不想要 吗apt-get dist-upgrade
?linux-image-*
例如,无法使用 更新软件包,apt-get upgrade
因为已安装新软件包。新软件包只能使用 进行安装dist-upgrade
。