>

在Linux下用 crontab 来实现定期的执行脚本的功能。

一. crontab 使用说明

1. crond 是 Linux 下定期执行程序的命令。

(通常,当安装完成操作系统之后,默认便会启动此任务调度命令。)
crond命令每分钟会定期检查是否有要执行的工作,如果有要执行的工作便会自动执行该工作。

而linux任务调度的工作主要分为以下两类:

  • a. 系统执行的工作,比如垃圾清理,备份
  • b. 用户自定义的工作,比如每5分钟执行一次脚本

2. crontab 是 UNIX 系统下定期执行任务的触发器。(Ubuntu 是叫 crontab 而不是 crond)

用户把要定期执行的任务记录在这个文件下面,然后crond定期的去检查这个定期执行列表,有要执行的工作时便自动执行。
通过man crontab可以查看到下面的信息
a. /etc/crond.allow 表示的是允许使用crontab的用户列表
b. /etc/crond.deny 表示的是不允许使用crontab的用户列表

3. crontab 常用的几个命令格式

crontab -l //显示用户的crontab文件的内容
crontab -e //编辑用户的crontab文件的内容
crontab -r //删除用户的crontab文件

4,crontab 文件的基本格式如下所示

* * * * * command
分 时 天 月 周 命令
每列表示意义
a. 第一个*表示的是分钟1~59分钟,默认*表示的是每分钟都执行,x-y表示的是x~y这段每分钟都执行,*/n表示每n分钟执行一次,x,y,z表示的是x,y,z分钟都执行。
b. 第二个*表示的是小时1~23小时,默认*表示的是每小时都执行,x-y表示的是x~y这段每小时都执行,*/n表示每n小时执行一次,x,y,z表示的是x,y,z小时都执行。
c. 第三个*表示的是天1~31,默认*表示的是每天都执行,x-y表示的是x~y这段每天都执行,*/n表示每n天执行一次,x,y,z表示的是x,y,z天都执行。
d. 第四个*表示的是月1~12,默认*表示的是每个月都执行,x-y表示的是x~y这个段每月都执行,*/n表示每n分钟执行一次,x,y,z表示的是x,y,z天都执行。
e. 第五个*表示的是周0~6(0表示周天),默认周一~周天都执行,x-y表示周x~周y每天都执行。

5,crontab文件的一些例子

a. 30 21 * * * /usr/local/etc/rc.d/lighttpd restart //表示每天21:30重启apache
b. 45 4 1,10,22 * * /usr/local/etc/rc.d/lighttpd restart //表示每月1,10,22号4:45重启apache
c. 0,30 18-23 * * * /usr/local/etc/rc.d/lighttpd restart //表示每天18 : 00至23 : 00之间每隔30分钟重启apache
d. * */1 * * * /usr/local/etc/rc.d/lighttpd restart //表示每一小时重启apache
e. */5 * * * * /usr/local/etc/rc.d/lighttpd restart //表示每5分钟重启apache

二. crontab 使用实例

首先,在 /home/juniway/tmp/ 创建一个shell脚本名为 s.sh。 注意,脚本内部的路径使用绝对路径。
此脚本用于把当前的日期输出重定向到当前目录下的out文件。

然后,设置每2分钟执行一次这个脚本,>/dev/null 2>&1。
原因:系统会在每次执行完任务之后就发一个邮件告诉用户,通过这个操作可以把信息全部重定向到/dev/null中,/dev/null这个文件类似回收站过一段时间系统自动清理。

*/2 * * * * sh /home/juniway/tmp/s.sh >/dev/null 2>&1

然后,发现过了n个2分钟,out文件根本就没有输出。
因为 crontab 可能有时无法执行用户家目录下面的两个文件,分别是.bashrc和.bash_profile。

这二个文件的作用:

  • .bashrc作用是用于bash shell的bash信息,当登录时及每次打开新的shell时,该文件被读取;
  • .bash_profile作用是每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次!

默认情况下,设置一些环境变量,执行用户的.bashrc文件。
因此,要手动在crontab文件中添加这条命令 source /home/juniway/.bashrc && source /home/juniway/.bash_profile

source的作用是当前bash环境下执行命令,而scripts是启动一个子shell来执行命令。
这样如果把设置环境变量(或alias等等)的命令写进scripts中,就只会影响子shell,无法改变当前的BASH,所以通过文件(命令列)设置环境变量时,要用source 命令。
因此crontab文件中变成:

*/2 * * * * source && /home/juniway/.bashrc && source /home/juniway/.bash_profile && sh /home/juniway/tmp/s.sh >/dev/null 2>&1

发现可以定时的执行脚本。
如果还不行,那只能通过查找log来查错。
非ubuntu的Linux crond的日志文件保存在/var/log下。

三. ubuntu下使用crontab定时执行脚本

注意问题:

(1)ubuntu下crontab的服务程序是cron,并且默认cron服务的log是没有的,必须手动开启

  • a. sudo vim /etc/rsyslog.d/50-default.conf
  • b. 找到cron.*那一行把注释去掉
  • c. 然后,重启cron服务 sudo service cron restart
  • d. 这样就可以在/var/log里面发现有cron的日志文件了,可以通过查看日志文件找到问题所在。

(2)ubuntu下,用户家目录下是没有.bash_profile文件的,并且会自动去执行.bashrc文件。可以这样操作:

*/2 * * * * sh /home/juniway/tmp/s.sh >/dev/null 2>&1