例行工作,有点类似上班打卡,等等循环的工作
LINUX 工作排程的种类, at , cron
一种是例行性的,就是每隔一定的周期要来办的事项 crontab
一种是突发性的,就是这次做完以后就没有的那一种 at ( 要想运行,必须启动 atd 服务, 启动办法 /etc/init.d/atd restart ( chkconfig atd on 设置每次开机自动启动 )
at
我们使用 at 这个指令来产生所要运作的工作,并将这个工作以文本文件的方式写入 /var/spool/at 目录内,该工作便能等待 atd 这个服务取用与执行了
/etc/at.allow 与 /etc/at.deny 这两个档案来限制用户是否可以使用 at ( 如果这两个档案都不存在,那么只有 root 可以使用 at 这个指令,先检查at.allow,再检查at.deny
at [-mldv] TIME at -c 工作号码
-m : 当at 完成之后,及时没有输出信息,以 email通知使用者该工作已完成 ( 如果没有信息输出,就不发送邮件,如果没有指定 -m 参数 )
-l : at -l 相当于 atq , 列出目前系统的所有 at 排程
-d : at -d 相当于 atrm , 可以取消一个 at 排程的工作
-v : 可以使用比较明显的事件格式栏出 at 排程中的任务栏表
-c : 可以列出后面接的该项工作的实际指令内容
时间格式: HH:MM (或 HH:MM YYYY-MM-DD ) 例如: 04:00 2009-03-17 或 now + 5 minutes 或 04pm + 3 days
at now + 5 minutes 进入 at > // 这种 now + 时间的方式比较好
at > /bin/mail root-s "testing a job" < /root/.bashrc
at > <EOF> 这里输入 ctrl + d 就会出现 EOF 的字样
at -c 4
at 另一个很棒的优点是,背景执行
脱机继续工作的任务,比如大型的程序,需要运行很久,比如跑3天,如果是用windows连接的linux,如果连接中断,那么这个程序也会中断,因为它所依赖的shell被中断了,
而如果有了 at, 就可以让这个程序在背景下工作,而不依赖于终端机
at 执行与所有的终端机环境无关,而所有 standard output/standard error output 都会传送到执行者的 mailbox 去啦,所以终端机当然看不到任何信息,可以通过 echo "hello" > /dev/tty1来取代,这样就能显示在屏幕上了
atq ( 查看所有的 at )
atrm 5 ( 5 是 job no. ) ( 移除工作5 )
crontab
/etc/cron.allow 和 /etc/cron.deny ( 一般只用一个就可以了,例如 /etc/cron.deny, 有at中的文件一样,如果没有,就只有root能执行 )
该工作会被记录到 /var/spool/cron/用户 中 在工作没有被执行,准备的时候
cron 执行的每项工作都会记录到 /var/log/cron 这个登录档中,因为它是循环执行的,所以会有历史记录
如果你使用 crontab -e 直接编辑工作可以, 但是如果有多个工作时,每个工作要占一行,另外如果多个工作时,你如果想删除其中的一个, 那么只能使用
crontab -e 编辑, 把那行删除, 如果是想把所有的工作全部删除,那么使用 crontab -r
crontab [-u username] [-l | -e | -r]
-u : 只有 root 可以,帮助其他使用者 建立/删除 crontab 工作
-e : 编辑 crontab
-l : 查看 crontab
-r : 删除 crontab 工作内容
因为是循环指令,所以需要有时间戳,
指令格式如下
分钟 小时 日期 月份 周 指令
0-59 0-23 1-31 1-12 0-7 指令 ( 周的 0 和 7 都是星期天 )
* 星号 : 代表任何时刻都接受的意思。 比如日,月,周都是* , 那就有可能代表,不论何月,何日,的礼拜几 该时间都执行
, 逗号 :代表时间断点, 0 3,6 表示 3点 和 6点 只是这两个时间点
-减号 :代表时间间隔, 0 3-6 代表 3,4,5,6,都执行
/n 斜线:每个的意思,/5 表示每隔5分钟
* /5 * * * * 就是每隔5分钟1次
系统配置文件 /etc/crontab
只需要编辑 /etc/crontab 这个档案,就可以做例行事例,有一点需要特别注意, crontab -e 这个就是编辑 /usr/bin/crontab 。系统每分钟都会读取一次 /etc/crontab 与 /var/spool/cron 里边的数据内容。因此你编辑完 /etc/crontab之后,保存后,一会就会立刻执行了。
周与日期的时间戳不能共存
以上工作例程的作用是,比如当你使用windows远程连接到linux时,此时调用bash,而当你中断这个连接时,同样,这个bash也就被销毁了。所以如果你有什么大的程序需要运行很长时间时,那么,有可能出现网络中断而你的程序还没有运行完,所以。。。如果是使用这种例程来运行,那么默认就会交给系统自己运行,即便你退出了登录也没有关系。
可以唤醒停机时间的工作任务
比如你的 linux在晚上要关机,而晚上23点多还有例程工作要做。因为时间错过了。那不是没办法工作了? 引入 anacron 命令
anacron 以天为单位或者是在开机后立刻运行 anacron 动作,执行完后就会自动停止了。
anacron 会以 一天,七天, 一个月为期去侦测系统未进行的 crontab 任务。
anacron [-sfn] [job]
anacron -u [job]
-s : 强制执行,不判断时间记录文件的时间戳 ( 用来判断关机时间 )
-n : 立刻进行未执行的任务
-u : 仅更新时间记录文件的时间戳,不进行任何工作
job : 由 /etc/anacrontab 定义的各项工作内容