我有一台运行 Ubuntu 服务器的电脑。
有时当我 ssh 进入时,我会收到一条消息,提示某些软件包需要升级。
我通过运行(以 root 身份)来升级软件
aptitude update && aptitude safe-upgrade
有时这就足够了。但有时我还需要重新启动,直到我随后 ssh 登录时才收到通知。我怎样才能更快地发现?
理想情况下,我希望通过运行类似
aptitude update && aptitude safe-upgrade &&
if aptitude needs-reboot ; then shutdown -r now ; fi
但该aptitude needs-reboot
命令不存在。我应该运行什么?
澄清:
- 实际上我有两台电脑,一台运行 10.04 (lucid),另一台运行 11.04 (natty)。我希望两台电脑都有相同的解决方案。
- 请严格遵循命令行解决方案。其中一台电脑没有显示器,两台电脑都没有键盘。
答案1
一种不太好的方法(可能特定于 Ubuntu)是检查此文件是否存在:
/var/run/reboot-required
如果存在,则需要重新启动。
因此,Bash 中的函数.bash_rc
(和 co.)可以完成这项工作:
function needs_reboot {
if [ -f /var/run/reboot-required ]; then
read -p "Restart needed. Reboot? (y/N) " answer;
if [ "$answer" = "y" -o "$answer" = "Y" ]; then
reboot;
fi
else
echo "No restart";
fi
}
这个想法从何而来? MOTD 在登录时由pam_motd
进程更新,从目录中读取其内容/etc/update-motd.d
。在这个目录中,有一个/etc/update-motd.d/98-reboot-required
脚本(在 Ubuntu 12_04 上)检查我们的 是否存在/var/run/reboot-required
。这显然是决定重启建议的方式。因此,上面的函数只是以交互方式进行相同的检查。
我真的很想直接从 APT 获得它,但就目前而言,这可行......
答案2
这样怎么样(以 root 身份运行):
apt-get update && apt-get dist-upgrade --dry-run | grep linux-; if [ $? -eq 0 ]; then yes | apt-get dist-upgrade && reboot; else yes | apt-get dist-upgrade; fi
如果有内核更新,grep linux-
将返回 0,然后您将重新启动。该yes
命令可以用 代替apt-get dist-upgrade --assume-yes
。如果未找到内核更新,则不会重新启动。
答案3
如果内核升级了,则仅需要重新启动。