cron是Linux下的一个定时执行工具,可以在无需人工干预的情况下运行作业。
在VPS上,cron一般用来执行定时备份任务,非常方便。
Centos默认已安装cron,但是并不自动运行,可以用以下的方法来启动和设置自动启动:
复制代码 代码如下:
#service crond start #启动服务
#chkconfig crond on #开机自动启动
可以用crontab -e命令来编辑/var/spool/cron下对应用户的cron文件,也可以直接编辑/etc/crontab。
cron的命令格式如下:
分 小时 日 月 星期 命令
0-59 0-23 1-31 1-12 0-6 command
其中,0表示星期日,一行对应一个命令。
下面举几个例子,基本涵盖了常见的一些情况:
复制代码 代码如下:
5 * * * * ls 指定每小时的第5分钟执行一次ls命令
30 5 * * * ls 指定每天的 5:30 执行ls命令
30 7 8 * * ls 指定每月8号的7:30分执行ls命令
30 5 8 6 * ls 指定每年的6月8日5:30执行ls命令
30 5 8 6 * ls 指定每年的6月8日5:30执行ls命令
30 6 * * 0 ls 指定每星期日的6:30执行ls命令
30 3 10,20 * * ls 每月10号及20号的3:30执行ls命令
25 8-11 * * * ls 每天8-11点的第25分钟执行ls命令
*/15 * * * * ls 每15分钟执行一次ls命令
30 6 */10 * * ls 每个月中,每隔10天6:30执行一次ls命令
22 4 * * * root run-parts /etc/cron.daily
#每天4:22以root身份执行/etc/cron.daily目录中的所有可执行文件,run-parts参数表示,执行后面目录中的所有可执行文件。
添加后保存的路径是/var/spool/cron,可以直接用vi查看和修改。
脚本文件:
bakTime=` date +%Y%m%d%H%M%S`
cp /home/test/dump.rdb /home/test/bakRedis/$bakTime.rdb
linux 下执行.sh文件总是提示permission denied
如果你是root登陆的话(不是的话,切换到root用户,对*.sh赋可执行的权限)
chmod 777 *.sh
or
chmod +x *.sh
然后运行就OK了
Crontab用法
[root@yang1 data]# crontab --help #<==注:crontab –l –e都是直接操作/var/spool/cron/下当前用户名的文件
usage: crontab [-u user] file #<==指定某用户如crontab –u yang2 –e,编辑yang2家目录下的crontab
crontab [-u user] [ -e | -l | -r ]
(default operation is replace,per 1003.2)
-e (edit user's crontab) #<==编辑当前用户的定时任务
-l (list user's crontab) #<==查看当前用户的定时任务
-r (delete user's crontab) #<==删除定时任务
-i (prompt before deletinguser's crontab) #<==删除crontab文件内容,删前会有提示
-s (selinux context)
注:crontab –e 编辑定时任务,退出时可以检查语法,直接编辑/var/spool/cron/root不能。如果大批量添加任务,则使用echo追加。
cron执行的每一项工作都会被纪录到/var/log/cron这个日志文件中,可以从这个文件查看命令执行的状态。
4、Crontab命令的书写格式
* * * * * /bin/sh /scripts/yy.sh |
分 时 日 月 周 命令和文件路径 |
(00-59) (0-23) (1-31) (1-12) (0-6) |
所用符号表示意思 |
* 星号每的意思 |
- 减号连续一段时间,如:00 17-19 * * * cmd 每天下午17点,18点,19点执行一次命令 |
, 逗号多个时间段,如:00 10-11,17-19 * * * cmd 每天的上午10,11点整,下午的17,18,19点整执行一次命令 |
/n n代表数字,指每隔n时间执行一次,如: */2 * * * * cmd 每隔2分钟执行一次命令 |
1)举例:
30 12-16/2 * ** cmd
每天的中午12点到下午4点间,每隔2小时执行一次
* 23-7/1 * * 25pxd
注:这是一个错误的命令
日和周不能同时用,若要以月为间隔,则日或周必有一个有值
其它如:小时上有值,则分钟上也要有值
*/1 * * ** echo yangrong >>/var/log/yy > /dev/null 2>&1
每隔一分钟把yangrong打印到yangrong1文件中,但该命令无法执行,因为>>与>/dev/null不可同时使用
2)/dev/null 2>&1解释
0是标准输入 使用<或<< |
1是标准输出 使用>或>> |
2是标准错误输出 使用2>或2>> |
>/dev/null 2>&1 即错误输出与标准输出全部重定向到空,可以写成1>/dev/null 2>/dev/null |
3)关于重定向的作用
重定向到空可以避免碎片文件占用inode资源
重定向到一个指定log里,可以看任务是否执行
4)关于导致磁盘inode满情况分析
定时任务执行成功or失败时,程序会向上层发送mail,由于平时工作中不打开sendmail功能,所以邮件会存储在临时目录/var/spool/clientmqueue,随着执行的任务次数多,文件也会越来越多,直到某一天,添加文件时,提示No space left on device,主要问题原因不在于垃圾文件会占很大空间,而在于每个文件会占用inode节点。(centos6.4默认不装sendmail,可能不会导致这个问题发生)。
所以crontab规则后需加 /dev/null 2>&1。
注:>> 与 >/dev/null 2>&1不可同时存在,不然无法执行