一、简介
Linux系统任务是由 cron (crond) 这个系统服务来控制的,这个系统服务是默认启动的。crond 命令每分锺会定期检查是否有要执行的工作,如果有要执行的工作便会自动执行该工作。用户自己设置的计划任务则使用crontab 命令。
二、Crontab配置
在CentOS系统中,
cat /etc/crontab
配置文件可以看到如下解释:
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# For details see man 4 crontabs
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
可以看到 创建一个定时任务 需要指定:
cron表达式 指定用户(可省略) 具体执行任务
用基础的 调度器、触发器、执行器来划分:
crontab程序本身是调度器,
在配置文件中配的cron表达式是触发器,
在配置文件中配置的具体执行任务是执行器。
crontab语法
crontab [ -u user ] file
或者
crontab [ -u user ] { -l | -r | -e }
注:如果不使用 -u user 的话,就是表示设定自己的时程表。
-e : 执行文字编辑器来设定时程表(最常用)
-r : 删除目前的时程表
-l : 列出目前的时程表
举例:
0 */2 * * * /sbin/service httpd restart 意思是每两个小时重启一次apache
50 7 * * * /sbin/service sshd start 意思是每天7:50开启ssh服务
50 22 * * * /sbin/service sshd stop 意思是每天22:50关闭ssh服务
0 0 1,15 * * fsck /home 每月1号和15号检查/home 磁盘
1 * * * * /home/bruce/backup 每小时的第一分执行 /home/bruce/backup这个文件
00 03 * * 1-5 find /home "*.xxx" -mtime +4 -exec rm {} \; 每周一至周五3点钟,在目录/home中,查找文件名为*.xxx的文件,并删除4天前的文件。
30 6 */10 * * ls 意思是每月的1、11、21、31日是的6:30执行一次ls命令
命令:
service crond start //启动服务
service crond stop //关闭服务
service crond restart //重启服务
service crond reload //重新载入配置
三、特殊事项:
- crontab有2种编辑方式:直接编辑/etc/crontab文件与crontab –e,其中/etc/crontab里的计划任务是系统中的计划任务,而用户的计划任务需要通过crontab –e来编辑;
- 每次编辑完某个用户的cron设置后,cron自动在/var/spool/cron下生成一个与此用户同名的文件,此用户的cron信息都记录在这个文件中,这个文件是不可以直接编辑的,只可以用crontab -e 来编辑。
- crontab中的command尽量使用绝对路径,否则会经常因为路径错误导致任务无法执行。
- 新创建的cron job不会马上执行,至少要等2分钟才能执行,可从起cron来立即执行。
- %在crontab文件中表示“换行”,因此假如脚本或命令含有%,需要使用\%来进行转义。
- 脚本无法执行问题
如果我们使用 crontab 来定时执行脚本,无法执行,但是如果直接通过命令(如:./test.sh)又可 以正常执行,这主要是因为无法读取环境变量的原因。
解决方法:
所有命令需要写成绝对路径形式,如: /usr/local/bin/docker。
在 shell 脚本开头使用以下代码:
#!/bin/sh
. /etc/profile
. ~/.bash_profile
3、在 /etc/crontab 中添加环境变量,在可执行命令之前添加命令 . /etc/profile;/bin/sh,使得环境变量生效,例如:
20 03 * * * . /etc/profile;/bin/sh /var/www/runoob/test.sh
四、适应场景:
Liunx的定时任务适合进行一些非业务的操作,比如简单的检测业务系统是否异常,定时清除一些系统冗余数据,检查系统情况等。在Liunx定时中不建议放特别复杂的逻辑。