E8.1 在您的系统上,一个本地用户以有规律的时间间隔运行开销很大的任务,滥用他的crontab特权。在几次要求他停止后,您被迫收回他的特权。列出删除他的当前crontab文件,并确保他不能增加新的crontab文件所需的步骤。
A:假定用户test就是我们需要惩罚的用户,目前你的帐号是root。列出帐号test的crontab文件指令是:
root@wgzhao-nb:~# crontab -u test -l
# m h dom mon dow command
20 3 * * * /usr/bin/hugecmd
删除的指令是:
root@wgzhao-nb:~# crontab -u test -r
要禁止该用户添加新的crontab文件,需要编辑(创建)/etc/cron.deny文件,将对应的帐号加入其中 echo "test" >>/etc/cron.deny 其结果如下演示:
root@wgzhao-nb:~# crontab -u test -e
You (test) are not allowed to use this program (crontab)
See crontab(1) for more information
E8.2 想出3项需要定期运行的任务,写出每项任务的crontab配置项,指出配置文件应该送入那个crontab文件。
A:实际上,系统默认的情况下,已经有大量的定时任务了,以我的ubuntu 9.10 桌面系统来看,默认的/etc/cron.\*/\*下的配置项来获得对crontab的进一步认识。
E8.3 找到您运行的Linux系统上的crontab文件,选出3个。解读每一个文件,并说明他何时运行,做什么。以及您认为为什么需要这个配置项。
A:我们就分别从/etc/cron.{daily,weekly,d}里找一个出来分析把。
先分析/etc/cron.daily/sysstat,内容如下:
#!/bin/sh
# Generate a daily summary of process accounting. Since this will probably
# get kicked off in the morning, it is run against the previous day data.
# our configuration file
DEFAULT=/etc/default/sysstat
# default settings, overriden in the above file
ENABLED=false
SA2_OPTIONS=""
[ ! -x /usr/lib/sysstat/sa2 ] && exit 0
# read our config
[ -r "$DEFAULT" ] && . "$DEFAULT"
[ "$ENABLED" = "true" ] || exit 0
exec /usr/lib/sysstat/sa2 -A $SA2_OPTIONS
这段脚本的目的是生成sar文件,方便以后分析当前的状态,包括系统日志,性能等。对于服务器而言,这个服务是比要的,而且应该每天执行。这样万一某天服务器出现故障,至少从这些SAR文件可以获得一些信息,看看是什么问题导致系统出现了故障,看是软件故障,还是性能的问题。
我们再看/etc/cron.weekly/clean-log 脚本内容如下:
#!/bin/bash
#delete all archived log file (which has .gz suffix)
cd /var/log
find . -name \*.gz -exec rm -f '{}' \;
find . -name \*.old -exec rm -f '{}' \;
exit 0
这段脚本每周的周一回执行一次,目的是删除/var/log下的所有归档日志。其目的当然是节省磁盘空间。当然,如果你觉得你的硬盘足够大,那么这段定时任务就并不是非要不可的了。
/etc/cron.d/php5配置项,内如如下:
# /etc/cron.d/php5: crontab fragment for php5
# This purges session files older than X, where X is defined in seconds
# as the largest value of session.gc_maxlifetime from all your php.ini
# files, or 24 minutes if not defined. See /usr/lib/php5/maxlifetime
# Look for and purge old sessions every 30 minutes
09,39 * * * * root [ -x /usr/lib/php5/maxlifetime ] && [ -d /var/lib/php5 ] && find /var/lib/php5/ -type f -cmin +$(/usr/lib/php5/maxlifetime) -print0 | xargs -n 200 -r -0 rm
代码前面的注释说的非常明白了。这段代码每30分钟执行一次,主要是删除过期的会话文件。如果是一个高负载的web站点,使用了大量的会话,这个定时任务很有必要。
♥E8.4 编写一个脚本,保持您有帐号的所有机器上的启动文件(\~/.[a-z]*}同步。从cron定期运行这个脚本。
A:如果文件拷贝走scp方式,而且需要采取密码认证方法,恐怕这个脚本就不会那么容易写了,因为scp不接受从配置文件获取密码,必须是从标准输入接受(至少我目前是这样理解的),因此同步的前提,是首先确保这些有帐号的机器做了公钥认证模式。剩下的就是同步启动文件了,不过在同步之前,考虑到一些特别情况,最好是先备份机器上的配置文件。示例脚本如下:
#!/bin/bash
# all machines list include account ,each line format account@hostname
file="machines.txt"
#first backup current startup scripts
for i in `cat $file`
do
ssh $i tar -czf ~/script-backup-`date +%s`.tar.gz ~/.[a-z]*
scp ~/.[a-z]* $i:~/
done
然后把这个脚本丢到/etc/cron.{hourly,daily,weekly,monthly,d}的任何一个目录都可以。
♥E8.5 以du,sort和head命令的手册页作为参考,编写一个脚本,确定系统上最大的10个主(home)目录。在每周一的夜里12:00执行这个脚本,并且让它把输出结果发给您。
A:暂时找不到拥有大量帐号的机器,我就用/usr/share作为目标替代吧。
首先测试脚本,一般来说,这种要求,应该当行脚本可以搞定: du -s \* |sort -rn |head -n 10 接下就是把这个结果发送出去,那么采取mail指令好了,先把上述结果保存到一个临时文件,然后把这个临时文件的内容当作邮件正文发出去。采用管道方式,连临时文件都省略了。
du -s \* |sort -rn |head -n 10 |mail -s "statistic report"
root@localhost.localdomain 收信如下:
[root@localhost locale]# mail
Mail version 8.1 6/6/93. Type ? for help.
"/var/spool/mail/root": 1 message 1 new
>N 1 root@localhost.localdomain Thu Dec 31 00:33 25/679 "statistic report"
& 1
Message 1:
From root@localhost.localdomain Thu Dec 31 00:33:02 2009
Date: Thu, 31 Dec 2009 00:33:02 +0800
From: root
To: root@localhost.localdomain
Subject: statistic report
8836 fr
8728 es
8412 de
7604 sv
7432 ru
6700 ja
6432 it
6120 pl
6032 gu
5956 tr