如何使用 crontab 作业执行简单的“apt-get 更新和升级”脚本?

如何使用 crontab 作业执行简单的“apt-get 更新和升级”脚本?

我创建了 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

有两个问题:

  1. 您正在使用sudo这意味着它将提示输入密码并且没有给出密码。所以它只会挂在那里。简单的解决方案是使用 root 的cronsudo crontab -e或者向 root 用户添加一个条目/etc/cron.crontab),从而避免需要sudo.

  2. 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 身份运行,无需密码。

请参见这位超级用户的回答我在其中更详细地介绍了这两种技术。

相关内容