AutoWeeklyUpdateHowTo

来自Ubuntu中文
Oneleaf留言 | 贡献2007年5月30日 (三) 18:53的版本 (新页面: == 使用 cron-apt 自动更新软件包 == 原文出处:https://wiki.ubuntu.com/AutoWeeklyUpdateHowTo 原文作者: 授权许可: * [http://creativecommons.org/licenses/by-sa/2...)
(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)
跳到导航跳到搜索

使用 cron-apt 自动更新软件包

原文出处:https://wiki.ubuntu.com/AutoWeeklyUpdateHowTo

原文作者:

授权许可:

翻译人员:lattice

校正人员:

贡献人员:

适用版本: 文章状态:等待翻译


cron-apt包(universe仓库)设计用来自动更新软件包列表和下载更新的软件包。因此它从根本上说是调用apt-get和apt-get dist-upgrade -d命令来完成的。为了让cron-apt能够正常运行,需要在/etc/cron.daily目录或者/etc/cron.weekly目录里用如下命令来创建链接:sudo ln -s /usr/sbin/cron-apt /etc/cron.daily/.cron-apt,这个命令只是用来下载新的软件包,如果你需要安装这些软件包还需要手工执行sudo apt-get dist-upgrade。

使用cron-apt的时候你无需遵从下面这些步骤。 使用cron和apt-get来进行每周自动软件更新

警告:如果有任何系统变动,那么新的或额外的问题可能出现。请确认备份好你的数据和配置!由本文造成的损失自行负责。这是第一版的草稿。

保持你的Ubuntu(或基于Debian)系统的软件包正常更新不仅能够帮助使你的系统更安全,而且能够使它运行时有更少的bug。这篇 HowTo 讨论了如何在你的系统上创建简单容易的cron任务来进行系统每周自动软件包更新、更新后删除老的没用的软件包。

(这篇文档假设假设你的系统一直或者几乎一直是用宽带网络连接而不是拨号)

  • 创建cron周更新任务文件
    首先你得创建cron任务文件。你可以使用简单的文本编辑器来创建这个文件然后保存在你的主目录里。在Ubuntu中,打开“应用程序”-〉“附件”-〉“文本编辑器”。在文本编辑器里,键入以下内容:
#!/bin/bash
apt-get update
apt-get upgrade -y
apt-get autoclean


现在点击保存,命名为如“autoupdt”之类的名称。默认目录为你的主目录,需要你确认好的。(以下步骤假设这个文件保存在了你的主目录里。)

  • 把cron任务文件移到cron.weekly
    现在你已经建好了cron任务文件,需要把它移到cron周计划目录里面去,这样才能够使它能够每周自动运行。要做到这一点,我们首先得打开一个命令终端。在Ubuntu里,点击“应用程序”-〉“系统工具”-〉“终端”。现在你应该看到命令提示符了。提示符后键入“ls”然后回车。在文件列表里尼应该看见新建的文件“autoupdt”。
user@system:~$cd ~
user@system:~$ls


现在你知道了文件在哪里了,我们需要将此文件移到正确的目录里面去。在命令行提示符后键入以下命令来移动文件:

user@system:~$sudo mv autoupdt /etc/cron.weekly


(系统可能提示你输入sudo密码,那就是你的密码。译者注:建立系统的第一个用户的密码)现在我们需要到Cron目录去证实一下这个文件被移过来了。命令提示符下输入:

user@system:~$cd /etc/cron.weekly
user@system:~$ls


你应该在文件列表里看见“autoupdt”文件。(如果看不到,试着将上面的移动命令重做一遍)

  • 把Cron任务文件变为可执行
    现在文件创建好了,可以给cron来每周执行了,为了能使cron运行它,我们还需要把文件变为可执行文件。因为你已经在cron.weekly目录里了,你所要做的就是在提示符下键入以下命令:
user@system:~$sudo chmod 755 autoupdt


(系统可能又提示你要输入sudo密码)

完成了!

现在那个任务文件变成可执行,你的工作就完成了。cron任务将每周运行,更新你的源列表(看看是否有新的软件包更新)、如果找到你需要的软件包那么将进行更新、然后把不再使用的软件包清除掉。你仍然可以使用新立得软件包管理器或者在命令行上使用apt-get来更新,但是现在你知道你的系统将每周自动进行更新,你就可以轻松一下下啦。 另一种方法:使用有日志记录的Aptitude进行软件包更新

Apt-get不在日志文件中记录改变的细节。Aptitude则将日志记录在/var/log/aptitude,也可以向root发送一份报告,如果 Postfix设置好了的话还会重定向给sudo用户。对于上面的这个例子,建立一个/etc/cron.weekly/autoupdt脚本,并且将其变为可执行文件:

#!/bin/bash (-)

tmpfile=$(mktemp)

echo "aptitude update" >> ${tmpfile}
aptitude update >> ${tmpfile} 2>&1
echo "" >> ${tmpfile}
echo "aptitude dist-upgrade" >> ${tmpfile}
aptitude -y dist-upgrade >> ${tmpfile} 2>&1
echo "" >> ${tmpfile}
echo "aptitude clean" >> ${tmpfile}
aptitude clean >> ${tmpfile} 2>&1

mail -s "Aptitude cron $(date)" root  ${tmpfile}
rm -f ${tmpfile}

如果你的计算机上没有装sendmail或者postfix服务,这里我提供的脚本(基于上面的例子)就很有用了。它提取了aptitude的输出然后利用你设置的邮件服务器手动地发送出一封邮件。你必须设置好邮件的接收者。对于上面的例子来说,创建/etc/cron.weekly/autoupdt脚本并且将其变为可执行文件:

#!/bin/bash
#
# use aptitude to automatically install updates. log and email any
# changes.
#

#
# variables to change
#

# address to send results to
[email protected]
# host name of smtp server
MAIL=mail.yourisp.com


#
# script is below here (do not change)
#

tmpfile=$(mktemp)

#
# smtp setup commands
#

echo "helo $(hostname)" >> ${tmpfile}
echo "mail from: root@$(hostname)" >> ${tmpfile}
echo "rcpt to: $MAILTO" >> ${tmpfile}
echo 'data'>> ${tmpfile}
echo "subject: Aptitude cron $(date)" >> ${tmpfile}

#
# actually run aptitude to do the updates, logging its output
#

echo "aptitude update" >> ${tmpfile}
aptitude update >> ${tmpfile} 2>&1
echo "" >> ${tmpfile}
echo "aptitude dist-upgrade" >> ${tmpfile}
aptitude -y dist-upgrade >> ${tmpfile} 2>&1
echo "" >> ${tmpfile}
echo "aptitude clean" >> ${tmpfile}
aptitude clean >> ${tmpfile} 2>&1

#
# i get a lot of escaped new lines in my output. so the following
# removes them. this could be greatly improved

tmpfile2=$(mktemp)
cat ${tmpfile} | sed 's/\r\r/\n/g'|sed 's/\r//g' > ${tmpfile2}
mv ${tmpfile2} ${tmpfile}

#
# smtp close commands
#

echo >> ${tmpfile}
echo '.' >> ${tmpfile}
echo 'quit' >> ${tmpfile}
echo >> ${tmpfile}

#
# now send the email (and ignore output)
#

telnet $MAIL 25 < ${tmpfile} > /dev/null 2> /dev/null

#
# and remove temp files
#

rm -f ${tmpfile}