1、Linux 工作排程的种类: at, crontab
种类 | 依赖服务 | 描述 |
at | atd | 是个处理仅执行一次就结束排程的命令,不过要执行 at 时,必须要启动 atd 这个服务 |
crontab | crond | 这个指令所设定的工作将会循环的一直进行下去,必须要启动 crond 这个服务。 |
2、使用者的设定:可以限制使用 crontab 的使用者账号:
/etc/cron.deny | 将不可使用crontab的账号写入其中,一个账号一行 |
/etc/cron.allow | 将允许的账号写入其中 |
3、
/var/spool/cron/使用用户 | 记录用户的crontab工作。/var/spool/cron/root是root用户的定时任务配置文件 |
/var/log/cron | 记录cron 执行的每一项工作。可以检查有没有木马 |
[root@www /]# cat /var/spool/cron/root
#backup /etc/hosts/etc/rc.local by shiwei at 2016-08-17
* * * * * /bin/sh /server/scripts/back.sh
[root@www /]# cat /var/log/cron
Aug 17 15:25:02www CROND[25845]: (root) CMD (/bin/sh /server/scripts/back.sh)
4、检查crond服务有没有启动
(1)[root@www /]# ps-ef |grep crond|grep -v grep
root 26331 1 017:21 ? 00:00:01 crond
(2)[root@www /]# /etc/init.d/crond status
crond (pid 26331)is running...
5、启动crond服务:
/sbin/service crond start | 启动服务 |
/sbin/service crond stop | 关闭服务 |
/sbin/service crond restart | 重启服务 |
/sbin/service crond reload | 重新载入配置 |
6、crontab命令
-e(edit) | 编辑crontab的工作内容 |
-l(list) | 查看crontab的工作内容 |
-r(remove) | 移除所有的 crontab 的工作内容,若仅要移除一项,用 -e 编辑 |
7、定时任务指令的使用格式:
用户的定时任务规则一般分为6段,每个段通过空格来分隔。
** * * * command
分时日月周
代表意义 | 分钟 | 小时 | 日期 | 月份 | 周 | cmd |
数字范围 | 0-59 | 0-23 | 1-31 | 1-12 | 0-7 |
注意:周的数字为0或7时,都代表星期天
特殊字符 | 代表意义 |
* | 星号,表示任意时间都接受,“每”的意思 |
- | 减号,代表一个时间段。如:17-19点 |
, | 逗号,分隔时段。如:30 2,3,4 * * * cmd |
/n | n代表数字,即每隔n单位时间。如:*/3 |
例子:
(1)30 3,12 * * * /bin/sh/scripts/oldboy.sh
每天凌晨3点和中午的12点的半点时刻执行脚本文件
(2)0,30 18-23 * * * cmd
每天18点至23点之间每隔半小时执行命令或脚本文件
(3)30 */6 * * * cmd
每隔6小时的半点时刻执行脚本或命令
(4)40 5 * * 6,0 cmd
每周六,周日的5:45分执行脚本或命令
(5)00 */2 ** * cmd (易错)
每隔两小时执行脚本或命令
(6)00 11 * 4 1-3 cmd
4月的每周一至周三的上午11点执行命令或脚本
8、系统的配置文件:/etc/crontab
[root@www /]# cat /etc/crontab
SHELL=/bin/bash<<==使用哪种shell接口
PATH=/sbin:/bin:/usr/sbin:/usr/bin<<==执行文件搜寻路径
MAILTO=root<<==当 /etc/crontab中的例行性工作的指令发生错误时,或是该工作的执行结果有STDOUT/STDERR 时,会将错误讯息或是屏幕显示的讯息传给谁?
HOME=/<<==默认此shell的家目录所在
系统的定时任务分为7个段,以空格来分隔:
* * * * *user-name command
9、一些注意事项:
(1)资源分配不均的问题
(2)取消不必要的输出项目:
当有执行结果或是执行的项目中有输出的数据时,该数据将会 mail 给MAILTO 设定的账号,那么当有一个排程一直出错那么你就会一直收到错误消息。重定向到垃圾桶(>/dev/null 2>&1)
(3)安全的检验:
很多时候被植入木马都是以例行命令的方式植入的,所以可以藉由检查/var/log/cron 的内容来视察是否有非自己设定的cron 被执行了。
(4)周与日月不可同时并存:
即:不可使用【几月几日且为星期几】的写法。
10、定时任务规范:
(1)定时任务执行的脚本要规范路径:如:在/server/scripts目录下创建脚本
(2)要先在命令行执行要写到脚本里的命令,确保无误,再把命令复制粘贴到脚本里
(3)脚本里的命令要使用全路径(可用which查询命令全路径)
(4)使用crontab –e编辑定时任务时,要添加必要的注释
(5)定时任务命令或脚本结尾需要加>/dev/null 2>&1,清楚不必要的输出或错误输出
(6)执行shell脚本任务前加/bin/sh
(7)注意%放在crontab –e里需要转义,而在脚本里无需转义
(8)可通过crond定时任务日志调试(/var/log/cron)定时任务
(9)sh –x调试脚本
11、通过例子实战定时任务:
例1、优化:设置linux服务器时间同步互联网时间(NTP服务)
(1)手动同步:同步阿里云的时间服务器
[root@www /]#/usr/sbin/ntpdate ntp1.aliyun.com
18 Aug 10:56:36 ntpdate[2166]: step timeserver 182.92.12.11 offset 3.666680 sec
(2)通过定时任务同步:假设每隔5分钟做一次时间同步
[root@www /]# echo '#time sync by shiwei at2016-08-18'>>/var/spool/cron/root(添加注释)
[root@www /]# echo'*/5 * * * * /usr/sbin/ntpdate ntp1.aliyun.com >/dev/null2>&1'>>/var/spool/cron/root
其实就是vi /var/spool/cron/root
特别说明:定时任务命令或程序最好写到脚本里执行
例2、通过编辑脚本配置定时任务
每天晚上00:30,打包服务器配置文件/etc/rc.local, /etc/hosts,备份到/backup目录下,每次备份按时间生成不同的备份包,并删除5天前的备份包。
第一步:创建脚本存放的目录:
[root@www /]# mkdir -p /server/scripts
第二步:创建备份目录:
[root@www/]# mkdir backup
第三步:切换到根目录,在命令行执行命令,确保命令正确
[root@www/]# cd /
[root@www/]# tar -zchf backup/bak_$(date+%F-%H-%M).tar.gz etc/hosts etc/rc.local
[root@www/]# cd backup/
[root@wwwbackup]# ll
total4
-rw-r--r--.1 root root 363 Aug 18 16:10 bak_2016-08-18-16-10.tar.gz
第四步:编辑脚本,并把复制上面执行的命令粘贴在脚本里,这样不容易错
[root@www/]# cd /server/scripts/
[root@wwwscripts]# vim backup.sh
cd / &&\
/bin tar -zchfbackup/bak_$(date +%F-%H:%M).tar.gz etc/hosts etc/rc.local &&\
/bin/find /backup -type f-name "*.tar.gz" -mtime +5 |xargs rm –f
第五步:测试脚本成不成功:
[root@wwwbackup]# sh /server/scripts/backup.sh
[root@wwwbackup]# ll
total4
-rw-r--r--.1 root root 363 Aug 18 16:41 bak_2016-08-18-16:41.tar.gz
第六步:编辑定时任务
[root@wwwscripts]# crontab –e
#file backup by shiwei at2016-08-18
30 00 * * * /bin/sh /server/scripts/backup.sh >/dev/null2>&1
第七步:查看定时任务
[root@wwwscripts]# crontab –l
第八步:如果脚本有误,需要调试脚本
[root@www/]# sh -x /server/scripts/backup.sh
+cd /
++date +%F-%H-%M
+/bin/tar -zchf backup/bak_2016-08-18-16:46.tar.gz etc/hosts etc/rc.local
+xargs rm -f
+/bin/find /backup -type f -name '*.tar.gz' -mtime +5