您现在的位置是:首页 > 学无止境
用cron+at 调度作业
在 Linux 系统上,许多管理任务必须频繁地定期执行。这些任务包**转日志文件以避免装满文件系统、备份数据和连接时间服务器来执行系统时间同步。在本文中,学习 Linux 中提供的调度机制,包括 crontab 和 at 命令。
以一定的时间间隔运行作业
以一定的时间间隔运行作业需要使用 cron 设施进行管理,它由 crond 守护进程和一组表(描述执行哪些操作和采用什么样的频率)组成。这个守护进程每分钟唤醒一次,并通过检查 crontab 判断需要做什么。用户使用 crontab 命令管理 crontab.crond 守护进程常常是在系统启动时由 init 进程启动的。
为了简单,假设希望定期运行清单 1 所示的命令。这个命令实际上只报告日期和时间,其他什么事都不做,但是它可以说明如何使用 crontab 设置 cron 作业,而且还可以通过输出看到作业运行的时间。设置 crontab 条目需要一个包含转义的 shell 元字符的字符串,所以适合于简单的命令和参数。在这个示例中,将从脚本 /home/test/mycron.sh 运行 echo 命令,这个脚本不需要参数。 这可以减少处理转义字符的工作。
清单 1. 一个简单的命令示例
[test@localhost ~]# cat mycron.sh
#!/bin/bash
echo "It is now $(date +%T) on $(date +%A)"
[test@localhost ~]# ./mycron.sh
It is now 18:37:42 on Friday
创建 crontab
使用 crontab 命令和 -e(表示 “edit”)选项创建 crontab.这会打开 vi 编辑器,除非在 EDITOR 或 VISUAL 环境变量中指定了另一种编辑器。
每个 crontab 条目包含六个字段:
分钟
小时
日
月
星期
由 sh 执行的字符串
分钟和小时的范围分别是 0-59 和 0-12,日和月的范围分别是 1-31 和 1-12.星期的范围是 0-6,0 表示星期日。星期也可以指定为 sun、mon、tue 等等。第 6 个字段包含前 5 个字段之后的所有内容,它是要传递给 sh 的字符串。百分号(%)将转换为空行,所以如果要使用 % 或其他任何特殊字符,就要在前面加上反斜线()。第一个 % 之前的一行传递给 shell,这个 % 之后的所有行都作为标准输入传递。
各个与时间相关的字段可以指定一个单独的值、值的范围(比如 0-10 或 sun-wed)或者以逗号分隔的单独值和范围列表。
清单 2 给出一个 crontab 条目示例
0,20,40 22-23 * 7 fri-sat /home/test/mycron.sh
在这个示例中,我们的命令在 7 月的每个星期五和星期六晚上 10 点到午夜之间的第 0、20、40 分钟(每 20 分钟)执行。
crontab 存储在哪里?
suid 程序
suid 程序以程序文件的所有者的权限运行,而不是采用运行程序的用户的权限。关于 suid 的更多信息,参见教程 “LPI 101 考试准备:设备、Linux 文件系统和 Filesystem Hierarchy Standard”;关于 passwd 命令的更多信息,参见教程 “LPI 102 考试准备:管理任务”。
用 crontab 命令创建的 crontab 存储在 /etc/spool/cron 下面的一个子目录中,这个子目录与创建 crontab 的用户同名,所以上面的 crontab 存储在 /etc/spool/cron/test中。因此,与 passwd 命令一样,crontab 命令是一个用根权限运行的 suid 程序。
/etc/crontab
除了 /var/spool/cron 中的用户 crontab 文件之外,cron 还会检查 /etc/crontab 文件和 /etc/cron.d 目录中的文件。在这些系统 crontab 中,在第五个时间字段(星期)和命令之间增加了一个字段。这个字段指定哪个用户应该运行这个命令,一般情况下是根用户。清单 3 给出一个 /etc/crontab 文件示例。
清单 3. /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly
在这个示例中,真正的工作由 run-parts 命令执行,它运行 /etc/cron.hourly、/etc/cron.daily 等目录中的脚本;/etc/crontab 仅仅控制执行作业的时间。注意,这里的所有命令都作为根用户运行。还要注意,crontab 可以包含 shell 变量赋值,这些赋值会在运行命令之前执行。
在指定的时间运行作业
有时候,需要只运行作业一次而不是定期运行。为此,应该使用 at 命令。要运行的命令是从 -f 选项指定的文件读取的,如果没有使用 -f,那么从 stdin 读取。-m 选项向用户发送邮件,即使命令没有 stdout.-v 选项显示运行作业的时间。这个时间也显示在输出中。
清单 4 给出一个运行 mycron.sh 脚本的示例。清单 5 显示在运行作业之后通过邮件发送给用户的输出。注意,这里的输出比对应的 cron 作业输出要简单一些。
清单 4. 使用 at 命令
[test@localhost ~]# at -f mycron.sh -v 10:25Sat Jul 7 10:25:00 2008job 5 at Sat Jul 7 10:25:00 2008
清单 5 at 命令使用的时间值
[test@localhost ~]# at -f mycron.sh 10pm tomorrow
job 14 at Sun Jul 8 12:00:00 2008
[test@localhost ~]# at -f mycron.sh 12:00 tuesday
job 15 at Tue Jul 10 12:00:00 2008
[test@localhost ~]# at -f mycron.sh 12:00 july 11
job 16 at Wed Jul 11 12:00:00 2008
[test@localhost ~]# at -f mycron.sh 12:00 next week
job 17 at Sat Jul 14 12:00:00 2008
管理调度的作业
列出调度的作业
可以管理 cron 和 at 作业。使用 crontab 命令和 -l 选项列出 crontab,使用 atq 命令显示用 at 命令加入队列中的作业,见清单 6.
清单 6. 显示调度的作业
[test@localhost ~]# crontab -l0,20,40 22-23 * 7 fri-sat /home/test/mycron.sh[test@localhost ~]# atq
16 Wed Jul 11 12:00:00 a test 删除调度的作业
可以使用 cron 命令和 -r 选项删除所有调度的 cron 作业,见清单 7.
清单 7. 显示并删除 cron 作业
[test@localhost ~]# crontab -l0,20,40 22-23 * 7 fri-sat /home/test/mycron.sh[test@localhost ~]# crontab -r[test@localhost ~]# crontab -lno crontab for ian
要删除系统 cron 作业,应该编辑 /etc/crontab或者编辑或删除 /etc/cron.d 目录中的文件。
可以使用 atrm 命令加作业号删除用 at 命令调度的一个或多个作业。多个作业应该用空白分隔。清单 8 给出一个示例。
清单 8. 用 atq 和 atrm 显示并删除作业
[test@localhost ~]# atq
14 Sun Jul 8 22:00:00 2008 a test
15 Tue Jul 10 02:00:00 2008 a test
16 Wed Jul 11 02:00:00 2008 a test
17 Sat Jul 14 02:00:00 2008 a test
[test@localhost ~]# atrm 14 15 16
[test@localhost ~]# atq
17 Sat Jul 14 02:00:00 2008 a test
配置用户对作业调度的访问
如果文件 /etc/cron.allow 存在,那么非根用户必须在其中列出,才能使用 crontab 和 cron 设施。如果 /etc/cron.allow 不存在,但是 /etc/cron.deny 存在,那么其中列出的非根用户不能使用 crontab 或 cron 设施。如果这两个文件都不存在,那么只允许超级用户使用这个命令。空的 /etc/cron.deny 文件允许所有用户使用 cron 设施,这是默认情况。
/etc/at.allow 和 /etc/at.deny 文件对 at 设施起相似的作用。
具体实例:
在PHP下动态设定时间,crontab+at来设定一次任务调度的
我只说一下思路:
(1)通过php页面设置一个时间,通过写文件的方式写到mycron.sh中,
格式例如:at -f /home/test/myat.sh 03:01 12/06/2008
说明:2008年12月06日3时1分执行myat.sh批处理文件
(2)myat.sh批处理文件是你要执行的的任务调度,假如是调用一个发送邮件的php文件:
myat.sh内容:/usr/bin/php -q /var/www/sendmail.php
(3)在crontab下增加一行条目:1 0 * * * root /home/test/mycron.sh
说明:每天的0时1分执行mycron.sh批处理文件
最好在执行完mycron.sh文件后把文件清空,避免重复设置at
下一篇:SSH命令使用技巧
文章评论
- 登录后评论
点击排行
-
php-fpm安装、配置与优化
转载自:https://www.zybuluo.com/phper/note/89081 1、php中...
-
centos下postgresql的安装与配置
一、安装(以root身份进行)1、检出最新的postgresql的yum配置从ht...
-
Mysql的大小写敏感性
MYSQL在默认的情况下查询是不区分大小写的,例如:CREATE TABLE...
-
关于URL编码
转载自:http://www.ruanyifeng.com/blog/2010/02/url_encoding....
-
header中的Cache-control
网页的缓存是由HTTP消息头中的“Cache-control”来控制的,常见的...