![如何使用 crontab 作业执行简单的“apt-get 更新和升级”脚本?](https://linux22.com/image/208113/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%20crontab%20%E4%BD%9C%E4%B8%9A%E6%89%A7%E8%A1%8C%E7%AE%80%E5%8D%95%E7%9A%84%E2%80%9Capt-get%20%E6%9B%B4%E6%96%B0%E5%92%8C%E5%8D%87%E7%BA%A7%E2%80%9D%E8%84%9A%E6%9C%AC%EF%BC%9F.png)
我创建了 update.sh 如下:
#!/bin/bash
sudo apt-get update
sudo apt-get upgrade
echo "Updated Successfully!
并创建了以下 crontab 作业来每小时运行此脚本:
0 * * * * bash /home/ubuntu/update.sh >> /home/ubuntu/cron_test.txt
但只创建了 echo 命令的日志文件条目(因为我也尝试每分钟运行它),并且没有确认我的 bash 是否正在更新。我在 WSL2 和 VMWare Ubuntu 终端中都尝试过此操作。在 WSL 中,它甚至不记录 echo 执行条目。可能是什么问题?
答案1
有两个问题:
您正在使用
sudo
这意味着它将提示输入密码并且没有给出密码。所以它只会挂在那里。简单的解决方案是使用 root 的cron
(sudo crontab -e
或者向 root 用户添加一个条目/etc/cron.crontab
),从而避免需要sudo
.apt命令本身也会提示,运行时需要确认安装
apt upgrade
。您也可以通过运行来解决这个问题apt upgrade -y
。
现在,上述两种“解决方案”都不好。请不要使用其中任何一个,而是安装无人值守升级,一个专为执行此操作而设计的工具,您就可以了。
答案2
您面临着几个问题,这两个问题的根源都是 WSL 默认情况下(或不容易)运行 Systemd。我在一篇文章中对此进行了详细介绍询问Ubuntu答案另一个关于超级用户,所以我不会在这里再深入讨论这个问题。
但如果没有 Systemd:
unattended-upgrades
,这是在评论和另一个答案中建议的,不会起作用。您需要以
cron
其他方式启动,因为它在 Ubuntu 上通常也是由 Systemd 启动的。鉴于您的评论:它甚至不记录回显执行条目
...听起来
cron
根本没有运行,这是 WSL 下的预期。
但在提出任何可能的解决方案之前,我建议您可能不应该在 WSL 实例上执行此操作。 WSL 实例并非设计为长期运行、始终在线的环境。它们更像是运行发行版的 Docker 容器。因此,我总是担心后台发生升级中断。主机操作系统、wsl --shutdown
(或--terminate
)或许多因素中的任何一个都可能导致 WSL 实例在后台/无人值守升级过程中停止。
在物理/虚拟机上,unattended-upgrade-shutdown
可以禁止关机,直到无人值守升级完成。但是,在 WSL 上这是不可能的,这意味着 Apt 数据更容易被损坏。
apt upgrade
在进程中运行时也会出现这种情况cron
。
我建议只手动运行sudo apt update && sudo apt upgrade -y
。默认的 MOTD 会在需要时在某种程度上提醒您。
至于cron
在 WSL 上运行,可以通过几种不同的方式实现自动化。推荐的方法是在 Windows 11 上,其中有boot.command
可用的配置设置。
如果您使用的是 Windows 10,您可以将以下内容添加到您的~/.bashrc
:
wsl.exe -u root service cron status > /dev/null || wsl.exe -u root service cron start > /dev/null
它使用该wsl.exe
命令以 root 身份运行,无需密码。
请参见这位超级用户的回答我在其中更详细地介绍了这两种技术。