crontab命令

crontab命令常见于 Unix类Unix操作系统之中,用于设置周期性被执行的指令。该命令从标准输入设备读取指令,并将其存放于“crontab”文件中,以供之后读取和执行。该词来源于希腊语 chronos(χρόνος),原意是时间。
  通常,crontab储存的指令被 守护进程激活, crond常常在后台运行,每一分钟检查是否有预定的作业需要执行。这类作业一般称为cron jobs。

crontab文件

  crontab文件包含送交cron 守护进程的一系列作业和指令。每个用户可以拥有自己的crontab文件;同时, 操作系统保存一个针对整个系统的crontab文件,该文件通常存放于/etc或者/etc之下的子目录中,而这个文件只能由 系统管理员来修改。
  crontab文件的每一行均遵守特定的格式,由空格或tab分隔为数个领域,每个领域可以放置单一或多个数值。

使用说明

语法介绍

  

  crontab命令说明

   使用权限:
  root用户和crontab文件的 所有者
   语法:
  crontab [-e [UserName]|-l [UserName]|-r [UserName]|-v [UserName]|File ]
   说明:
  crontab 是用来让使用者在固定时间或固定间隔执行程序之用,换句话说,也就是类似使用者的时程表。-u user 是指设定指定 user 的时程表,这个前提是你必须要有其权限(比如说是 root)才能够指定他人的时程表。如果不使用 -u user 的话,就是表示设定自己的时程表。
   参数:
  -e [UserName]: 执行文字 编辑器来设定时程表,内定的文字编辑器是 VI,如果你想用别的文字编辑器,则请先设定 VISUAL 环境变数来指定使用那个文字编辑器(比如说 setenv VISUAL joe)
  -r [UserName]: 删除目前的时程表
  -l [UserName]: 列出目前的时程表
  -v [UserName]:列出用户cron作业的状态
   时程表的格式如下:
  f1 f2 f3 f4 f5 program
  其中 f1 是表示分钟,f2 表示小时,f3 表示一个月份中的第几日,f4 表示月份,f5 表示一个星期中的第几天。program 表示要执行的程式。
  当 f1 为 * 时表示每分钟都要执行 program,f2 为 * 时表示每小时都要执行程式,其余类推
  当 f1 为 a-b 时表示从第 a 分钟到第 b 分钟这段时间内要执行,f2 为 a-b 时表示从第 a 到第 b 小时都要执行,其余类推
  当 f1 为 */n 时表示每 n 分钟个时间间隔执行一次,f2 为 */n 表示每 n 小时个时间间隔执行一次,其余类推
  当 f1 为 a, b, c,... 时表示第 a, b, c,... 分钟要执行,f2 为 a, b, c,... 时表示第 a, b, c...个小时要执行,其余类推
  使用者也可以将所有的设定先存放在档案 file 中,用 crontab file 的方式来设定时程表。
  由于 unix版本不一样,所以部分语法有差别,例如在hp unix aix 中设定间隔执行如果采用*/n 方式将出现语法错误,在这 类unix中 ,间隔执行只能以列举方式,详请见例子。

使用方法:

  用VI编辑一个文件 cronfile,然后在这个文件中输入格式良好的时程表。编辑完成后,保存并退出。
  在命令行输入
  $: crontab cronfile
  这样就将cronfile文件提交给c r o n进程,同时,新创建cronfile的一个副本已经被放在/ v a r / s p o o l / c r o n目录中,文件名就是用户名。
   例子:
  每月每天每小时的第 0 分钟执行一次 /bin/ls :
  0 * * * * /bin/ls
  在 12 月内, 每天的早上 6 点到 12 点中,每隔 20 分钟执行一次 /usr/bin/backup :
  */20 6-12 * 12 * /usr/bin/backup
  周一到周五每天下午 5:00 寄一封信给 alex_mail_name :
  0 17 * * 1-5 mail -s "hi" alex_mail_name < /tmp/maildata
  每月每天的午夜 0 点 20 分, 2 点 20 分, 4 点 20 分....执行 echo "haha"
  20 0-23/2 * * * echo "haha"
  晚上11点到早上8点之间每两个小时,早上8点
  0 23-7/2,8 * * * date
  在hp unix,中,每20分钟执行一次,表示为:0,20,40 * * * * 而不能采用*/n方式,否则出现语法错误
   注意:
  1. 当程式在你所指定的时间执行后,系统会寄一封信给你,显示该程式执行的内容,若是你不希望收到这样的信,请在每一行空一格之后加上 > /dev/null 2>&1 即可。
  2. %在crontab中被认为是newline,要用\来escape才行。比如crontab执行行中,如果有"date +%Y%m%d",必须替换为:"date +\%Y\%m\%d"

创建crontab?

  在考虑向cron进程提交一个crontab文件之前,首先要做的一件事情就是设置 环境变量EDITOR。cron进程根据它来确定使用哪个 编辑器编辑crontab文件。99 %的UNIX和LINUX用户都使用vi,如果你也是这样,那么你就编辑$HOME目录下的.profile文件,在其中加入这样一行:
  EDITOR=vi; export EDITOR
  然后保存并退出。
  不妨创建一个名为<user>cron的文件,其中<user>是用户名,为了提交你刚刚创建的crontab文件,可以把这个新创建的文件作为cron命令的参数:
  $ crontab davecron
  现在该文件已经提交给cron进程,同时,新创建文件的一个副本已经被放在/var/spool/cron目录中,文件名就是用户名(即,dave)。

列出crontab文件

  为了列出crontab文件,可以用:
  $crontab -l

编辑crontab文件

  如果希望添加、删除或编辑crontab文件中的条目,而EDITOR 环境变量又设置为vi,那么就可以用vi来编辑crontab文件,相应的命令为:
  $ crontab -e
  可以像使用vi编辑其他任何文件那样修改crontab文件并退出。

删除crontab文件

  为了删除crontab文件,可以用:
  $ crontab -r

恢复丢失的crontab文件

  如果不小心误删了crontab文件,假设你在自己的$HOME目录下还有一个 备份,那么可以将其拷贝到/var/spool/cron/<username>,其中<username >是用户名。如果由于权限问题无法完成拷贝,可以用:
  $ crontab <filename>
  其中,<filename>是你在$HOME目录中副本的文件名。

crontab中的输出配置

  crontab中经常配置 运行脚本输出为:>/dev/null 2>&1,来避免crontab运行中有内容输出。
  shell命令的结果可以通过‘> ’的形式来定义输出
  /dev/null 代表空设备文件
  > 代表重定向到哪里,例如:echo "123" > /home/123.txt
  1 表示stdout标准输出,系统默认值是1,所以">/dev/null"等同于"1>/dev/null"
  2 表示stderr标准错误
  & 表示等同于的意思,2>&1,表示2的输出重定向等同于1
  那么重定向输出语句的含义:
  1>/dev/null 首先表示标准输出重定向到空设备文件,也就是不输出任何信息到终端,不显示任何信息。

  2>&1 表示标准错误输出重定向等同于标准输出,因为之前标准输出已经重定向到了空设备文件,所以标准错误输出也重定向到空设备文件。

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

最近在使用crontab过程中,接连遇到头疼的问题:手动执行脚本时一点问题都没有,可是放在crontab中脚本死活也不运行。最后查出来原因一次是因为脚本里面文件路径没有写全路径导致的,另一次是因为脚本运行需要依赖java环境变量,其实两次都是环境变量的问题造成的。从网上同样了解到一般crontab无法运行的问题都是由环境变量在crontab中不一定可识别引起的。某前辈总结说:crontab如果不注意的话早晚会出问题,而且这种问题一旦出一次,就会永远记得,因为这种问题很折腾人。精辟啊~~
下面我也来试试总结下crontab的基本用法,环境变量以及其他要注意的问题。各位看官可以参考下,有什么问题也可以留言讨论。
————————————————————————————
2.crontab与环境变量
不要假定cron知道所需要的特殊环境,它其实并不知道。所以你要保证在shelll脚本中提供所有必要的路径和环境变量,除了一些自动设置的全局变量。所以注意如下3点:
1)脚本中涉及文件路径时写全局路径;
2)脚本执行要用到java或其他环境变量时,通过source命令引入环境变量,如:
cat start_cbp.sh
#!/bin/sh
source /etc/profile
export RUN_CONF=/home/d139/conf/platform/cbp/cbp_jboss.conf
/usr/local/jboss-4.0.5/bin/run.sh -c mev &
3)当手动执行脚本OK,但是crontab死活不执行时。这时必须大胆怀疑是环境变量惹的祸,并可以尝试在crontab中直接引入环境变量解决问题。如:
0 * * * * . /etc/profile;/bin/sh /var/www/java/audit_no_count/bin/restart_audit.sh
3.其他应该注意的问题
1)新创建的cron job,不会马上执行,至少要过2分钟才执行。如果重启cron则马上执行。
2)每条 JOB 执行完毕之后,系统会自动将输出发送邮件给当前系统用户。日积月累,非常的多,甚至会撑爆整个系统。所以每条 JOB 命令后面进行重定向处理是非常必要的: >/dev/null 2>&1 。前提是对 Job 中的命令需要正常输出已经作了一定的处理, 比如追加到某个特定日志文件。
3)当crontab突然失效时,可以尝试/etc/init.d/crond restart解决问题。或者查看日志看某个job有没有执行/报错tail -f /var/log/cron。
4)千万别乱运行crontab -r。它从Crontab目录(/var/spool/cron)中删除用户的Crontab文件。删除了该用户的所有crontab都没了。
5)在crontab中%是有特殊含义的,表示换行的意思。如果要用的话必须进行转义\%,如经常用的date ‘+%Y%m%d’在crontab里是不会执行的,应该换成date ‘+\%Y\%m\%d’`。
—————————————————————————————–
/etc/profile, /etc/bashrc, .bash_profile和.bashrc的差别
用户登陆Linux操作系统的时候,”/etc/profile”, “~/.bash_profile”等配置文件会被自动执行。执行过程是这样的:登陆Linux系统时,首先启动”/etc/profile”,然后启动用户目录下的”~/.bash_profile”,如果”~/.bash_login”和”~/.profile”文件存在的时候也会在执行”~/.bash_profile”后被依次调用。
——————
cat .bash_profile
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
# User specific environment and startup programs
PATH=$PATHHOME/bin
export PATH
alias vi=vim
通过上面脚本可以看到~/.bash_profile文件先调用~/.bashrc,然后再把PATH加载。
——————
下面是一些区别:
/etc/profile:此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行,并从/etc/profile.d目录的设置文件中搜集shell的设置;
/etc/bashrc:为每一个运行bash shell的用户执行此文件,当bash shell被打开时,该文件被读取;
~/.bash_profile:每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次!默认情况下,他设置一些环境变量,执行用户的.bashrc文件,
~/.bashrc:该文件包含专用于你的bash shell的bash信息,当登录时及每次打开新的shell时,该文件被读取;
~/.bash_logout:当每次退出系统(退出bash shell)时,执行该文件;
——–
/etc/profile是全局性的功能,其中设置的变量作用于所有用户,~/.bash_profile中设置的变量能继承/etc/profile中的变量并作用于用户。
~/.bash_profile 是交互式、login 方式进入 bash 运行的;~/.bashrc 是交互式 non-login 方式进入 bash 运行的。


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值