使用 cron 让工作更轻松学习关于使用 cron 的一些提示和技巧,了解这个守护进程和相似的其他程序为什么是您的好朋友。
提示和技巧下面是关于 cron 的一些提示、技巧和常见的问题:
- 与在终端窗口中使用的 shell 或 shell 脚本不同,cron 并不 在 crontab 文件中就地展开环境变量。换句话说,如果在 crontab 中输入:
1
2
| HOME=/home/joe
PATH=$HOME/bin:/usr/bin:/bin
|
那么 PATH 并不会设置为您期望的路径。您必须手工展开所有变量,比如:
1
2
| HOME=/home/joe
PATH=/home/joe/bin:/usr/bin:/bin
|
但是,因为每个 cron 命令都由 shell 执行,所以命令可以 引用变量名。例如,如果在个人 crontab 中编写以下命令(注意这一行中省略了用户名参数):
1
| @daily $HOME/bin/cleanup_daily.sh
|
那么 $HOME 会正确地展开。
- 不要把计算密集型任务安排在同一时间启动,比如 @midnight。如果可能的话,在凌晨的几小时中分散地启动这些任务,以避免它们争用资源。
- 正如上面提到的,在默认情况下环境变量 SHELL 设置为 /bin/sh。如果不修改此变量,crontab 中的所有命令都由 /bin/sh 解释。但是,如果您不熟悉 /bin/sh,更喜欢另一种 shell,那么可以设置 SHELL 并使用这种 shell 的命令语法。 例如,如果设置 SHELL=/bin/zsh,那么所有命令都可以使用 Z shell 的功能,比如它的高级重定向操作符:
1
2
| SHELL=/bin/zsh
@daily uptime > daily >> weekly
|
在这里,uptime 命令的输出覆盖 daily 文件(>daily)并追加到 weekly 文件中(>> weekly)。
- 使用访问控制列表 (ACL) — /etc/cron.allow 和 /etc/cron.deny — 允许或拒绝特定用户运行 cron 作业。如果希望把对 cron 的访问权限制在很少几个用户,那么在 /etc/cron.allow 中列出这些用户的用户名。未指定的任何用户都无法使用 crontab 实用程序提交 crontab。但是,如果希望允许大多数人访问 cron 而拒绝少数用户,那么在 /etc/cron.deny 中列出受到限制的用户。 例如,如果 /etc/cron.allow 的内容如下:
那么除 Joe 和 Zelda 之外任何用户都无法访问 cron:
1
2
3
4
5
| % whoami
strike
% crontab ~/.crontab
You (strike) are not allowed to use this program (crontab)
See crontab(1) for more information
|
- 要想禁用 cron 发出的电子邮件报告,应该在 crontab 中设置 MAILTO=""。
- 再次重申,不要在列表中使用空格。列表值以逗号分隔。在 Vixie cron 中,在范围中不使用日和月份的名称。
- 要仔细阅读系统的 cron 文档。路径、特性和简便措施都可能不一样。在命令行上输入 man 5 crontab 了解 crontab 文件的语法。输入 man 1 crontab 了解 crontab 实用程序。在命令行上输入 man cron 或 man 8 cron 了解 cron 守护进程本身的选项。
系统管理员最好的朋友cron 和与它相似的程序对于系统管理员非常有帮助。如果您需要反复执行相同任务,就可以考虑用 cron 实现自动化。捕捉具有许多步骤的复杂任务常常需要 shell 脚本,但是许多任务只需要一行命令。
下面仅仅是一些思路:
- 通过组合使用 cron 和数据库工具,创建每日转储。例如,命令:
1
| @daily joe mysqldump -pjoespwd accounts > $HOME/backups/accounts.`date +%F`.sql
|
每天把数据库 accounts 转储到一个文件。嵌入的日期命令(`date +%F`)确保文件名是惟一的,比如 accounts.2008-08-07.sql。此命令作为用户 joe 运行,所以用 -p 指定 Joe 的密码。此命令还可以放在 Joe 自己的 crontab 中,因为转储需要他的 MySQL 凭证。
- locate 子系统为系统上的所有文件编制索引,并把每个文件的完整路径存储在数据库中。然后,从命令行查询此数据库,就可以立即找到文件。当然,可以根据需要用 find 搜索文件,但是必须等待它搜索文件系统,这可能很慢。 为了让定位子系统发挥作用,必须定期为文件系统编制索引,因为随时可能添加和删除文件。这种情况就非常适合使用 cron。
1
| 0 0,12 * * * root updatedb
|
这个 crontab 项每天运行 updatedb(locate 更新实用程序)两次。
- 显然很适合用 cron 实现自动化的另一个任务是,把文件从主服务器复制到众多的从服务器。rsync 是一种跨多个系统分布和同步文件集合的现代实用程序。许多网管都通过组合使用 cron 和 rsync 把网站的主拷贝复制到服务器群中的每台服务器。
1
| @midnight www rsync -avz /var/www/site slave1:/var/www
|
在每天午夜,rsync 都会把 /var/www/site 复制(-avz)到 slave1 上的 /var/www。
使用命令行实用程序 mail 和 shell 管道操作符(|)把任务的输出发送给团队中的一个或多个成员。
1
| @weekly root df --print-type --local -h |& mail -s "Weekly df report" andy bob
|
在这里,每周通过电子邮件把 df 的输出发送给用户 Andy 和 Bob,让他们能够监视磁盘使用量。
|