crontab计划任务管理
crontab命令可以设置周期性任务,启用周期性任务时所对应的系统服务为crond,执行该命令会生成一个以用户名命名的配置文件,并自动保存在/var/spool/cron目录中,日志文件在/var/log/cron,配置文件在/etc/crontab,打开计划任务编辑界面(与vim中的操作相同)后通过该界面用户可以自行添加具体的任务配置,每行代表一个记录,每个记录包括6个字段,其格式为
/sbin/service crond start //启动服务
/sbin/service crond stop //关闭服务
/sbin/service crond restart //重启服务
/sbin/service crond reload //重新载入配置
参数:
-u :只有root 才能进行这个任务,也即帮其他用户新建/删除crontab工作调度。
-e :编辑crontab 的工作内容, 一个工作一行来编辑。
-l :查阅crontab 的工作内容,
-r: 删除所有的crontab的内容,若仅要删除一项,请用-e去编辑。
/etc/cron.allow 将可以使用crontab的账号写入其中,如不在其中则用户不能使用。
/etc/cron.deny 将不可以使用的写入其中,若没有记录在里面则可以使用, 优先判别/etc/cron.allow但默认只有/etc/cron.deny
注意:只有在“分钟+小时+日期+月份+星期”都满足的条件下才会执行操作的命令,比如上面的每个月25号的周二、四、六会执行后面的命令,但是这个月的25号是周五,那么今天就不会执行该作业。在计划任务配置记录中的命令建议使用绝对路径,以避免因缺少执行路径而无法执行命令的情况。关于命令的绝对路径,可以使用which命令查找确认。在设置非每分钟都执行的任务时,“分钟”字段也应该填写一个具体的时间数值(如“0”),而不要保留为默认的“*”,否则将会在每分钟执行一次计划任务
eg:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
[root@justin
cron
]
# which tar
/bin/tar
[root@justin
cron
]
# crontab -e -u justin #设置用户justin每个月25号的周一、周三、周五的18:00到22:00每隔2小时使用tar命令自动备份“/etc/httpd”目录。
0 18-22
/2
25 * 1,3,5
/bin/tar
zcvf httpd.
tar
.gz
/etc/httpd
[root@justin
cron
]
# crontab -l
no
crontab
for
root
[root@justin
cron
]
# crontab -l -u justin
0 18-22
/2
25 * 1,3,5
/bin/tar
zcvf httpd.
tar
.gz
/etc/httpd
[root@justin
cron
]
# crontab -r -u justin
[root@justin
cron
]
# crontab -l -u justin
no
crontab
for
justin
[root@justin
cron
]
#crontab -e
30 6 * * 0
ls
指定每星期日的6:30执行
ls
命令[注:0表示星期天,1表示星期1,以此类推,也可以用英文来表示,sun表示星期天,mon表示星期一等。]
30 3 10,20 * *
ls
每月10号及20号的3:30执行
ls
命令[注:“,”用来连接多个不连续的时段]
25 8-11 * * *
ls
每天8-11点的第25分钟执行
ls
命令[注:“-”用来连接连续的时段]
*
/15
* * * *
ls
每15分钟执行一次
ls
命令 [即每个小时的第0 15 30 45 60分钟执行
ls
命令 ]
30 6 *
/10
* *
ls
每个月中,每隔10天6:30执行一次
ls
命令[即每月的1、11、21、31日是的6:30执行一次
ls
命令。 ]
|
crontab中的任务没有执行
看 /var/log/cron、/var/spool/mail/root这2文件有crontab执行日志的记录,用tail -f /var/log/cron、/var/spool/mail/root 即可查看最近的crontab执行情况。
在 /var/spool/cron/tmp文件中,有croutXXX001864的tmp文件,tail 这些文件就可以看到正在执行的任务了。
如果脚本手动执行没问题,crontab无法执行,大部分是因为crontab没有读取到环境变量所致。
确认给sh文件指定bash环境或者所有命令使用绝对路径
1
2
|
[ -f ~/.bash_profile ] && . ~/.bash_profile
[ -f
/etc/profile
] && .
/etc/profile
|
今天在crontab来删除日志,设置如下
1
|
27 5 * * *
find
/app/apache-tomcat-7
.0.61
/logs/
-mtime +7 -
type
f -name
"*.*.log"
-
exec
/bin/rm
-f {} \;
|
发现不会执行,在也没看到执行的记录,然后把设置该成如下就成功执行
1
|
27 5 * * *
/usr/bin/find
/app/apache-tomcat-7
.0.61
/logs/
-mtime +7 -
type
f -name
"*.*.log"
-
exec
/bin/rm
-f {} \;
|
出现中文乱码的问题
手动执行正常,crontab执行后中文成乱码,此问题是因执行定时任务时没有去获取系统的环境变量,导致了中文乱码。在shell脚本开始的时候加下命令:export LANG="en_US.UTF-8"
1
2
|
#!/bin/sh
export
LANG=
"en_US.UTF-8"
|