1. crontab的安装
1.1. 检测服务器是否已经安装了crontab:
如果未安装,进行下列操作:
- yum install vixie-cron --> vixie-cron是安装cron的主程序
- yum install crontabs --> contabs用来安装、卸装、或列举用来驱动 cron 守护进程的表格的程序
1.2. 操作命令
2. crond表达式
{minute} {hour} {day-of-month} {month} {day-of-week} {full-path-to-shell-script}
- minute: 区间为 0 – 59
- hour: 区间为0 – 23
- day-of-month: 区间为0 – 31
- month: 区间为1 – 12. 1 是1月. 12是12月.
- Day-of-week: 区间为0 – 7. 周日可以是0或7.
一些符号的使用:
- 星号(*):代表所有可能的值,如month字段为星号,则表示在满足其它字段的制约条件后每月都执行该命令操作。
- 逗号(,):可以用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9”
- 中杠(-):可以用整数之间的中杠表示一个整数范围,例如“2-6”表示“2,3,4,5,6”
- 正斜线(/):可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。
- 百分号(%):在crontab中%是有特殊含义的,表示换行的意思。如果要用的话必须进行转义%,如经常用的date ‘+%Y%m%d’在crontab里是不会执行的,应该换成date ‘+%Y%m%d’。
示例:
- 每5分钟运行一次命令
*/5 * * * * /root/bin/check-status.sh - 每个月的第一天 13:10运行
10 13 1 * * /root/bin/full-backup.sh - 每个工作日 11 p.m 运行。
0 23 * * 1-5 /root/bin/incremental-backup.sh
0 23 * * 1,2,3,4,5 /root/bin/incremental-backup.sh
建议:
- 数字的表示最好用2为阿拉伯数字显示
- 周和日最好不要同时用
- 定时任务要加注解
- 可以定向到日志文件或者空文件
- 定时任务一定是绝对路径,且目录必须存在才能出结果
- crontab 服务一定要开启运行
3. cron表达式的添加
crontab执行脚本的添加有两种方式,一种是crond -e命令添加一个脚本,一种是创建一个crontab文件。
3.1 crond命令
使用crontab -e命令进行定时任务的编辑,部署一个脚本,示例如下:
其他命令:
3.2 crontab文件(用户级别)
在考虑向cron进程提交一个crontab文件之前,首先要做的一件事情就是设置环境变量EDITOR。
cron进程根据它来确定使用哪个编辑器编辑 crontab文件。99%的UNIX和LINUX用户都使用vi,你可以编辑$ HOME目录下的. profile文件,在其 中加入这样一行:
然后wq保存并退出
1)创建一个名为usercron的文件,其中user是用户名,例如, saintcron。在该文件中加入如下的内容
2)提交刚刚创建的crontab文件,命令格式:crontab [-u user] file
3)同时,新创建文件的一个副本已经被放在/var/spool/cron目录中,文件名就是用户名(即saint)
使用场景:
用户定期要执行的工作,比如用户数据备份、定时邮件提醒等。用户可以使用 crontab 工具来定制自己的计划任务。所有用户定义的crontab 文件都被保存在 /var/spool/cron目录中。其文件名与用户名一致。
3.3 crontab文件(系统级别)
crontab文件格式
前三行是用来配置crond任务运行的环境变量。
- 第一行SHELL变量指定了系统要使用哪个shell,这里是bash;
- 第二行PATH变量指定了系统执行命令的路径;
- 第三行MAILTO变量指定了crond的任务执行信息将通过电子邮件发送给root用户,如果MAILTO变量的值为空,则表示不发送任务执行信息给用户
1)编辑crontab文件
2)后续操作与3.2类似,最后重启一下crond服务。
4. 系统调度服务和用户调度服务
- 系统级任务调度主要完成系统的一些维护操作。
- 用户级任务调度主要完成用户自定义的一些任务。
- 可以将用户级任务调度放到系统级任务调度来完成(不建议这么 做),但是反过来却不行,root用户的任务调度操作可以通过“crontab –uroot –e”来设置,也可以将调度任务直接写入/etc /crontab文件。
- 如果要定义一个定时重启系统的任务,就必须将任务放到/etc/crontab文件,即使在root用户下创建一个 定时重启系统的任务也是无效的。
5. 注意点
1)可以在crontab文件中设置如下形式,忽略日志输出:
“/dev/null 2>&1”表示先将标准输出重定向到/dev/null,然后将标准错误重定向到标准输出,由于标准输出已经重定向到了/dev/null,因此标准错误也会重定向到/dev/null,这样日志输出问题就解决了。
2)脚本执行要用到java或其他环境变量时,通过source命令引入环境变量,如:
六、Crontab和scp结合使用
Linux下文件传输一般有两个命令scp、ftp(工具需要下载安装)
1. scp的文件传输脚本
这里假设主机A 用来获到主机B的文件。
- 在主机A的用户根目录下执行如下命令来生成配对密钥:
ssh-keygen -t rsa
遇到提示回车默认即可,两次回车后,显示完成。公钥被存到用户目录下.ssh目录,比如root存放在:
/root/.ssh/id_rsa.pub - 将 .ssh 目录中的 id_rsa.pub 文件复制到 主机B 的 ~/.ssh/ 目录中,并改名为 authorized_keys,
- 到主机A中执行命令和主机B建立信任,例(假设主机B的IP为:192.168.100.4):
scp ~/.ssh/id_rsa.pub 192.168.100.4:/root/.ssh/authorized_keys (如果是集群之间实现秘钥免登录,authorized_keys里面的内容就只能累加,而不能这样直接修改文件名) - 下面就可以用scp、ssh命令不需要密码来获取主机B的文件了
ssh 192.168.100.4 回车就不需要密码了。
注:其实id_rsa.pub内容添加到对方机器的authorized_keys中就行了
- 修改crontab的配置文件
sudo vi /etc/crontab - 使用crontab -e命令进行定时任务的编辑,部署一个脚本
- crontab -l 查看已经运行的定时任务