1.crontab环境介绍
1)cron服务在/etc/init.d/cron
2)执行文件/usr/sbin/cron
3)cron配置文件在/etc/cron.d
file list:.proto,FIFO,at.deny,cron.allow,cron.deny,queuedefs
4)cron的连接文件
/usr/lib/cron/ -> ../../etc/cron.d
5)用户的crontab文件位置
在/usr/spool/cron/crontabs目录下,以用户名命名的。
2.crontab服务启动,停止
cd /etc/init.d
./cron stop
./cron start
3.crontab命令说明
crontab –l:列出当前用户的crontab文件。
crontab –l username: 列出指定用户的crontab文件。(root用户)
crontab –e:编辑当前用户的crontab文件。
crontab –e username: 编辑指定用户的crontab文件。(root用户)
crontab –r: 删除当前用户的crontab文件。
crontab –r username: 删除指定用户的crontab文件。(root用户)
4.crontab语法说明
用户crontab文件的语法格式,每行语句为:* * * * * command,每一行表示一个任务,可以有多行语句。
这个文件共有6个字段,前5个字段为调度时间,分别为:
第一个*字段:0~59 表示分
第二个*字段:1~23 表示小时
第三个*字段:1~31 表示日
第四个*字段:1~12 表示月份
第五个*字段:0~6 表示星期(其中0表示星期日)
第六个command字段:要执行的命令
若要20分钟执行一次某个任务,可以这样写:
0,20,40 * * * * command
若要5分钟执行一次某个任务,可以这样写:
0,5,10,15,20,25,30,35,40,4,50,55 * * * * command
若要每分钟执行一次某个任务,可以这样写:
0-59 * * * * command,或者用默认值:* * * * * command
solaris下的crontab和linux下不一样,linux支持
*/5 表示每5分钟一次
*/20 表示每20分钟一次
而solaris不支持
crontab 的格式是
分 时 日 月 周 命令
*表示每隔最小单位,但是,分必须是明确的定义
因此,设定每小时执行一次的话,只需要指明每小时的哪一分钟执行就可以了
可以用
0 * * * * command 来设定每小时的0分钟执行命令
*代表的是任意时间。因此上面的命令代表的意思是任意月的任意星期任意天任意小时任意分钟都发送一封邮件,简单说就是每隔一分钟执行一次。
注意因为最小单位只有分,因此只能控制到分的粒度。
crontab * 默认一分钟启动一次监控程序,在一分钟内重启,则无法检测到。
5.crontab的编辑器设置
如果没有设置编辑器,crontab –e会调用缺省的编辑器。
设置编辑器:
首先得定义系统环境变量EDITOR, export EDITOR=vim,
然后再调用crontab –e。
6.举例说明
1)export EDITOR=vim
2)crontab –e,在文件里添加:
0-59 * * * * * /export/home/netcool/cron_test.sh
保存,退出(:wq)
3)vi /export/home/netcool/cron_test.sh
echo “aaa” >> /export/home/netcool/cron_test.log
chmod a+x /export/home/netcool/cron_test.sh
4)重启服务
cd /etc/init.d/
./cron stop
停止后ps –ef|grep cron查看是否存在,可以多执行停止命令
./cron start
7.Crontab不执行问题的解决办法
1.1. 确保执行脚本的路径正确,最好用全路径
1.2. 确保环境变量正确
可以在shell里设置好$HOME/.profile的环境变量。可以在shell里添加环境变量脚本,e.g.:
export OMNIBUS_HOME=/opt/netcool/omnibus
1.3. 权限问题
把当前用户加到/etc/cron.d/cron.allow,同时确保/etc/cron.d/cron.deny里没有当前用户。如果没有cron.allow文件,用root用户新建此文件。
1.4. FIFO的问题
1)先杀掉cron进程,可以用ps -ef|grep cron 得出id号,kill -9 PID
2)rm /etc/cron.d/FIFO
3)./cron start
crontab调用shell需注意的地方
crontab环境变量的问题:
crontab是进行例行性工作常用的命令,比如系统备份,编写一个备份的shell脚本后,使用crontab定时执行这个备份脚本,
就可实现自动备份了。将备份时间设置在三更半夜系统访问量小的时候,既不会影响系统日常使用,也不用派人盯着,
第二天看一下邮件,检查一下执行结果就好了。
1.使用普通变量
crontab执行shell时只能识别为数不多的系统环境变量,普通变量是无法识别的,如
果在编写的脚本中需要使用变量,需要使用export将变量声明为环境变量,脚本才能正常执行。
2.使用相对路径
crontab执行shell时,是不会进入到shell脚本所在的路径下执行的,如果shell里含有相对路径的话,
会找不到路径的,因此shell脚本中都要使用绝对路径。
3.权限设置错误
权限问题永远是linux需要注意的问题,一定要确保crontab的执行者(/etc/crontab文档设置的第二项)
有访问shell脚本所在目录并且执行此shell的权限(可使用chomd和chown修改权限和所有者)。
Step 1:
使用命令crontab -e编辑一个定时执行的任务或在/var/spool/cron/crontabs目录下新建一个与自己用户名相同的任务.
即:
#每隔一分钟执行一次后台程序tmpmail
* * * * * /home/milch/tmpmail
顺便提一下crontab中的命令格式:
第一个 * 表示分钟 (0-59),
第二个 * 表示小时 (0-23),
第三个 * 表示月份中的某一天 (1-31),
第四个 * 表示一年中的某一月 (1-12),
第五个 * 表示一周中的星期几 (0-6 with 0=Sunday).
Step 2:
停止cron进程,并重启,
命令:/etc/init.d/cron stop
/etc/init.d/cron start
15 1 * * * /opt/bin/ta.sh /opt/aadir > /dev/null
此处>/dev/null 必须用吗? 何意思?
输出重定向到/dev/null, 否则会mail到你的邮箱
dev/null 是一个特殊文件,所有输入到该文件的数据都会被丢弃。
> /dev/null 的意思就是丢弃所有的输出内容,否则(就象楼上老兄说的)就会将输出内容发送到执行该命令的用户信箱中。
这种写法只能把标准输出送到/dev/null中,如果有错误产生的话,还是会送到信箱里的。下面的写法才可以丢弃所有的输出内容:
15 1 * * * /opt/bin/ta.sh /opt/aadir > /dev/null 2>&1
Crontab on Solaris,布布扣,bubuko.com
Crontab on Solaris
原文:http://blog.csdn.net/quincyfang/article/details/20135339