参考链接
cron表达式在线解析:quartz/Cron/Crontab表达式在线生成工具-BeJSON.com
定时任务运行时报错解决方法
运行脚本报 权限不够问题:
可以在脚本文件夹下直接执行 如下指令运行RequestAPI.sh 脚本
./RequestAPI.sh
如果出现权限不够问题,运行如下指令:
chmod 777 ./RequestAPI.sh 或 chmod +x ./RequestAPI.sh 开放脚本文件权限
cron相关命令
命令功能 | 命令 | 说明 |
---|---|---|
启动服务 | service crond start | 启动文件路径:/sbin/service crond start |
关闭服务 | service crond stop | |
重启服务 | service crond restart | |
从新载入配置 | service crond reload | |
查看服务状态 | service crond status | |
创建编辑调度任务 | crontab -e | 编辑的是/var/spool/cron下对应用户的cron文件,也可以直接修改/etc/crontab文件,输入定时任务,然后保存退出即可。 |
查看该用户下的crontab服务是否创建成功 | crontab -l | 列出当前的所有调度任务 |
列出用户jp的所有调度任务 | crontab -l -u jp | |
删除所有任务调度工作 | crontab -r | |
查看服务是否已经运行 | ps -ax | grep cron | |
查看某个用户的定时任务 | crontab -u plan -l | plan为指定的用户名 |
删除某个用户的定时任务 | crontab -u plan -r | |
编辑某个用户的定时任务 | crontab -u plan -e | |
加入开机自动启动 | chkconfig --level 35 crond on |
cron文件语法:
Minute Hour Day Month Dayofweek command
分 小时 日 月 星期 命令
0-59 0-23 1-31 1-12 1-7 command (取值范围,表示周日一般一行对应一个任务)
记住几个特殊符号的含义:
“*”代表取值范围内的数字,
“/”代表”每”,
“-”代表从某个数字到某个数字,
“,”分开几个离散的数字
每个字段代表的含义如下:
Minute 每个小时的第几分钟执行该任务
Hour 每天的第几个小时执行该任务
Day 每月的第几天执行该任务
Month 每年的第几个月执行该任务
DayOfWeek 每周的第几天执行该任务
Command 指定要执行的程序
在这些字段里,除了“Command”是每次都必须指定的字段以外,其它字段皆为可选字段,可视需要决定。对于不指定的字段,要用“*”来填补其位置。*号之间需要有空格,表示每一个数字位,如果使用 / 说明每的时候,前面必须加星号
crontab每分钟定时执行:
*/1 * * * * service mysqld restart ##每隔1分钟执行一次
*/10 * * * * service mysqld restart ##每隔10分钟执行一次,从启动后开始的第一个十分钟开始执行,例如6:25开启启动,6:30执行第一次,然后6:40····
crontab每小时定时执行:
0 */1 * * * service mysqld restart ##每1小时执行一次0 */2 * * * service mysqld restart ##每2小时执行一次0 */12 * * * service mysqld restart ##每12小时执行一次,例如:8:36分启动,从启动开始,到12点执行第一次,然后0:00执行第二次
crontab每天定时执行:
0 10 * * * service mysqld restart ##每天10点执行30 19 * * * service mysqld restart ##每天19点30分执行1 12 * * * service mysqld restart ##每天12点01分执行1 0 * * * service mysqld restart ##每天0点01分执行
crontab每周定时执行:
0 10 * * 1 service mysqld restart ##每周一10点执行30 17 * * 5 service mysqld restart ##每周五17点30分执行
crontab每年定时执行:
0 10 1 10 * service mysqld restart ##每年的10月1日10点执行0 20 8 8 * service mysqld restart ##每年的8月8日20点执行
定时运行脚本命令举例
创建脚本文件夹(mkdir命令)并命名为Userscript,在脚本文件夹中创建脚本文件(touch命令),以功能命名,例如请求接口可以命名为RequestAPI.sh
创建一个文件名为result_list.yaml文件
运行crontab -e ,添加如下内容,先 cd到 脚本 目录,然后 再 && 执行脚本
*/10 * * * * cd /root/Scriptfile/RequestAPI && ./RequestAPI.sh 每十分钟运行一次/root/Scriptfile/ RequestAPI文件夹下RequestAPI.sh 脚本
0 */1 * * * cd /root/Scriptfile/RequestAPI && ./RequestAPI.sh 每一小时运行一次/root/Scriptfile/ RequestAPI文件夹下RequestAPI.sh 脚本
重新加载定时器
##如果是修改定时器,设置完成之后需要重新加载定时器,否则会执行修改前的定时器service crond reload
普通用户执行corntab 需要先安装crontabs, sudo yum install crontabs
接收API接口的文件使用 yaml 格式,json 格式文件得单独安装插件打开
#!/bin/sh#打印开始执行时间starttime=$(date +%Y-%m-%d\ %H:%M:%S)#将开始执行时间保存到result_list.yaml文件中echo $starttime >> result_list.yaml#调用接口,并把接口返回的数据保存到result_list.yaml文件中curl --location --request POST 'https://www.mellaserver.com/api/mellaserver/user/mellaLogin' \--header 'Content-Type: application/json' \--data '{"email": "123@qq.com","hash": "123456","identityTypeId":1}' >> result_list.yaml#打印执行结束时间endtime=$(date +%Y-%m-%d\ %H:%M:%S)echo $endtime >> result_list.yaml
定时访问接口举例
0 0 * * * wget http://192.144.141.166:8083/qingzhutool/hotel/recommend/sendmail/2bigAreaManager
定时请求接口数据举例
访问接口数据格式:
curl --location --request POST '填写url' \
--header 'xxxx: xxxxxxxxxxxxx' \
--header 'Content-Type: application/json' \
--data 'JSON格式'
举例
##以下为postman接口转换出命令,已在苹果电脑命令行验证curl --location --request POST 'https://www.mellaserver.com/api/mellaserver/user/mellaLogin' \--header 'Content-Type: application/json' \--data-raw '{"email": "123@qq.com","hash": "123456","identityTypeId":1}'##以下为linux可执行命令,--date后面-raw删掉了,已验证curl --location --request POST 'https://www.mellaserver.com/api/mellaserver/user/mellaLogin' \> --header 'Content-Type: application/json' \> --data '{"email": "123@qq.com","hash": "123456","identityTypeId":1}'
-H/--header <line> 自定义头信息传递给服务器
-X/--request <command> 指定什么命令
-d/--data <data> HTTP POST方式传送数据
--location Follow redirects (H) 跟随重定向
--raw Do HTTP "raw", without any transfer decoding (H) 执行HTTP“raw”,无需任何传输解码
curl发起http请求,追加到已有文件
#从nacos配置中心拉取配置数据
#!/bin/bash
RESULT=$(curl -s "http://localhost:8844/nacos/v1/cs/configs?dataId=global-config.yaml&group=test&tenant=global-config-info-namespace")
echo $RESULT >> default_values.yaml
定时任务详细说明
在LINUX中,周期执行的任务一般由cron这个守护进程来处理[ps -ef|grep cron]。cron读取一个或多个配置文件,这些配置文件中包含了命令行及其调用时间。
cron的配置文件称为“crontab”,是“cron table”的简写。
1、cron在3个地方查找配置文件
/var/spool/cron/ 这个目录下存放的是每个用户包括root的crontab任务,每个任务以创建者的名字命名。
/etc/crontab 这个文件负责安排由系统管理员制定的维护系统以及其他任务的crontab。
/etc/cron.d/ 这个目录用来存放任何要执行的crontab文件或脚本。
2、权限
crontab权限问题到/var/adm/cron/下一看,文件cron.allow和cron.deny是否存在
用法如下:
1、如果两个文件都不存在,则只有root用户才能使用crontab命令。
2、如果cron.allow存在但cron.deny不存在,则只有列在cron.allow文件里的用户才能使用crontab命令,如果root用户也不在里面,则root用户也不能使用crontab。
3、如果cron.allow不存在, cron.deny存在,则只有列在cron.deny文件里面的用户不能使用crontab命令,其它用户都能使用。
4、如果两个文件都存在,则列在cron.allow文件中而且没有列在cron.deny中的用户可以使用crontab,如果两个文件中都有同一个用户,
以cron.allow文件里面是否有该用户为准,如果cron.allow中有该用户,则可以使用crontab命令。
4、在crontab文件中如何输入需要执行的命令和时间
该文件中每行都包括六个域,其中前五个域是指定命令被执行的时间,最后一个域是要被执行的命令。
每个域之间使用空格或者制表符分隔。格式如下:
minute hour day-of-month month-of-year day-of-week commands
分钟 小时 每个月的哪天 每年的哪月 每个星期的礼拜几 需执行的命令
合法值 00-59 00-23 01-31 01-12 0-6 (0 is sunday) commands(代表要执行的脚本)
除了数字还有几个个特殊的符号就是"*"、"/"和"-"、",",*代表所有的取值范围内的数字,"/"代表每的意思,"/5"表示每5个单位,"-"代表从某个数字到某个数字,","分开几个离散的数字。
几个例子:
每五分钟执行一次: */5 * * * *
每小时执行一次 : 0 * * * *
每天执行一次: 0 0 * * *
每周执行一次: 0 0 * * 0
每月执行一次: 0 0 1 * *
每年执行一次: 0 0 1 1 *
每天早上6点
0 6 * * * echo "Good morning." >> /tmp/test.txt //注意单纯echo,从屏幕上看不到任何输出,因为cron把任何输出都email到root的信箱了。
每两个小时
0 */2 * * * echo "Have a break now." >> /tmp/test.txt
cron服务命令的一些参数与说明:
crontab -u //设定某个用户的cron服务,一般root用户在执行这个命令的时候需要此参数
crontab -l //列出某个用户cron服务的详细内容
crontab -r //删除没个用户的cron服务
crontab -e //编辑某个用户的cron服务
比如说root查看自己的cron设置:crontab -u root -l
再例如,root想删除fred的cron设置:crontab -u fred -r
在编辑cron服务时,编辑的内容有一些格式和约定,输入:crontab -u root -e
进入vi编辑模式,编辑的内容一定要符合下面的格式:*/1 * * * * ls >> /tmp/ls.txt
任务调度的crond常驻命令
crond 是linux用来定期执行程序的命令。当安装完成操作系统之后,默认便会启动此
任务调度命令。crond命令每分锺会定期检查是否有要执行的工作,如果有要执行的工
作便会自动执行该工作。