我在公共计算机房运行 Ubuntu 14.04,启用了无人值守升级,并配置为在凌晨 02:00 重启。PC 是双启动的,因此用户需要重启计算机才能启动另一个操作系统,但如果 uu 安装了一些更新,并将其设置为重启,则用户将无法自行完成此操作:如果他们单击齿轮图标,然后选择关机并重启,系统将什么也不做。
如果我以 root 身份登录并尝试发出重启命令,答案是“另一个关机已挂起”,因此我必须使用 shutdown -c 来取消它,然后我才能重启。这显然不是我想要的,因为用户应该能够在没有我(或 root)干预的情况下随时重启。
有人能帮助我实现我的目标吗(=将 uu 设置为自动安装,并在凌晨 2 点重新启动,让用户可以在需要时自由重新启动/关闭,而无需授予他们 root 权限)?
非常感谢,
安德里亚
答案1
阻止无人值守升级重新启动计算机
目前,无人值守升级设置为在凌晨 2:00 重启计算机(如果更新需要重启)。此步骤将停止此行为。
步:编辑文件/etc/apt/apt.conf.d/50unattended-upgrades
在文件内查找以下行:
unattended-Upgrade::Automatic-Reboot "true";
并使其看起来像:
Unattended-Upgrade::Automatic-Reboot "false";
创建一个 bash 脚本来检查是否需要重新启动,并在需要时执行重新启动
下面的脚本检查该文件是否reboot-required
存在,如果存在,则立即重新启动计算机。我们称此文件为reboot_if_needed.sh
。
#!/bin/bash
if [ -f /var/run/reboot-required ]; then
echo $(date) Sytem restart required by: $(cat /var/run/reboot-required.pkgs)
/sbin/reboot now
fi
将此文件另存为/opt/bin/reboot_if_needed.sh
使此文件可执行:
sudo chmod + x/opt/bin/reboot_if_needed.sh
解释
当脚本运行且文件var/run/reboot-required
存在时,它将输出一些将被捕获到日志文件中的文本/var/log/reboot_history.log
。然后系统将重新启动。
reboot_if_needed.sh
每天晚上 2:00安排
我们希望以管理员权限运行该脚本。因此我们使用。按 ++打开sudo
终端并输入:CtrlAltT
sudo crontab -e
此命令将打开 root 用户的 crontab 文件(如果存在),或创建一个空白的新文件。在文件末尾添加以下行:
0 02 * * * /opt/bin/reboot_if_needed.sh >> /var/log/reboot_history.log
如果使用文本文件编辑器,请按+nano
退出编辑器。编辑器将提示您保存更改。按然后按选择默认文件名。CtrlXYEnter
解释
中的每一行crontab
都有五个时间和日期字段,后面跟着一个命令,后面跟着一个换行符(“\n”)。字段之间用空格分隔。五个时间和日期字段不能包含空格。五个时间和日期字段如下:
- 分钟(0-59),
- 小时(0-23,0 = 午夜),
- 日 (1-31),
- 月(1-12),
- 工作日(0-6,0=星期日)。
因此,0 02 * * *
意味着每天晚上 2:00。
添加到的行crontab
将使脚本reboot_if_needed.sh
每天晚上 2 点运行。将>>
输出重定向到/var/log/reboot_history.log
文件。此文件将在第一次crontab
运行脚本时创建。
看https://help.ubuntu.com/community/CronHowto如何使用 crontab
为什么这有效?
Unattended-Upgrade 显然会延迟重启。例如:
sudo shutdown -r 02:00
上述命令安排在凌晨 2 点重启。当该命令生效时,您会收到消息“另一次关机已挂起”。
我们使用 crontab 来负责在凌晨 2 点启动重启过程,而不是在命令中安排它shutdown
。因此,一旦无人值守升级运行,就不会有待处理的关机。任何用户都可以重新启动计算机。
当任何用户重新启动计算机时,/var/run/reboot-required
如果文件存在,则系统会将其删除,因为不再需要重新启动。脚本不会在凌晨 2 点重新启动计算机。
希望这可以帮助