1Linux 工作排程的种类: 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/rootroot用户的定时任务配置文件

/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

重新载入配置

6crontab命令

-eedit

编辑crontab的工作内容

-llist

查看crontab的工作内容

-rremove

移除所有的 crontab 的工作内容,若仅要移除一项,用 -e 编辑

7、定时任务指令的使用格式:

用户的定时任务规则一般分为6段,每个段通过空格来分隔。

** * * *  command

分时日月周

 

代表意义

分钟

小时

日期

月份

cmd

数字范围

0-59

0-23

1-31

1-12

0-7


注意:周的数字为07时,都代表星期天

特殊字符

代表意义

*

星号,表示任意时间都接受,的意思

-

减号,代表一个时间段。如:17-19

逗号,分隔时段。如:30 2,3,4 * * * cmd

/n

n代表数字,即每隔n单位时间。如:*/3

例子:

130 3,12 * * * /bin/sh/scripts/oldboy.sh

每天凌晨3点和中午的12点的半点时刻执行脚本文件

20,30 18-23 * * * cmd

每天18点至23点之间每隔半小时执行命令或脚本文件

330 */6 * * * cmd

每隔6小时的半点时刻执行脚本或命令

440 5 * * 6,0 cmd

每周六,周日的5:45分执行脚本或命令

500 */2 ** * cmd   (易错)

每隔两小时执行脚本或命令

600 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)定时任务

9sh –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