Linux-使用Cron执行定时任务
本文主要讲述cron定时任务工具的使用, 包含cron用法及一次实际使用
Cron
cron在linux中主要用于处理定时任务, 分为crond和crontab.crond主要用于系统进程, 而我们主要使用crontab
cron服务开启状态确认
service crond status # 查看开启状态
systemctl start crond # 开启服务cron服务
cron表达式
控制执行时间的表达式
官方用法介绍
(base) cat /etc/crontab # 查看crontab配置文件
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# 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
用法示例
59 23 * * * sh /root/work_space/notice_test.sh >> /root/work_space/mylog.log 2>&1 # 每天23:59执行shell脚本,并输入日志
详细用法
参照: 简洁明了看懂cron表达式 - 知乎 (zhihu.com)
表达式验证工具: Cron - 在线Cron表达式生成器 (ciding.cc)
crontab
定时任务管理工具,加入定时任务有2中方法:
crontab -e: 直接编辑定时任务lsit
先制作cron文件, 再crontab xxx.cron 将cron语句加入list
crontab -l # 查看定时任务列表
crontab -e # 编辑定时任务 (自动进入vim编辑页面, 对现有cron语句进行编辑)
crontab xx.cron # 读取cron文件内的语句,加入crontab执行list
使用cron文件主要为了留存备份 , 直接crontab -e 更方便
异常排查方法
查看cron运行记录
tail -f -n 5 /var/log/cron
将输入结果输出到日志中去
56 14 * * * sh /root/work_space/notice_test.sh >> /root/work_space/mylog.log 2>&1
2>&1 的意思就是将标准错误重定向到标准输出
常见异常
cron冲突
具体表现为: 找不到环境依赖的某个包
conda会在用户的.bashrc
文件中修改环境变量,但cron起一个非interactive的bash的时候不会加载用户.bashrc
中的脚本。
如果我们需要在shell脚本中使用conda, 我们需要在cron执行的任务当中手动执行这些脚本。
source ~/.bashrc # 初始化Linux环境
conda activate base # 使用指定环境
python -m pytest testcases/test/test_questionnaire.py
时区问题
可通过运行记录判断,
解决方法可参照Crontab的时区问题 - 简书 (jianshu.com)
记录一次定时脚本运行
0准备
- 待运行的脚本 – 通过git传输
- 环境依赖 – 通过conda管理
1编辑sh文件
编写shell命令脚本,添加部署方式
cd ~/work_space/my-pytest-project/
source ~/.bashrc # 初始化Linux环境,主要为了启用conda
conda activate base # 使用指定环境
python -m pytest testcases/test/test_questionnaire.py # python -m将当前目录加入path中, 使用pytest方式运行用例
运行测试
(base) sh test.sh
2编辑cron文件
创建cron文件
vim test.cron # 进入vim界面添加定时任务语句
加入cron语句
56 14 * * * sh /root/work_space/notice_test.sh >> /root/work_space/mylog.log 2>&1
3设定定时任务
添加任务
(base) systemctl start crond #系统开启crond服务
(base) crontab ~/work_space/notice.cron # 将cron文件信息加入定时任务
(base) crontab -l # 查看当前定时任务
设置当前时间测试运行结果
(base) crontab -e
... # 对定时任务信息进行修改,增加稍晚时间
(base) tail -f mylog.log # 查看运行结果
4定时任务结果
删除测试语句, 等待定时任务执行后查看结果
总结
cron是类Unix系统中非常有名的定时任务工具, Jenkins就内置了cron .
使用cron,我们可以非常方便的定时执行shell脚本, 适用于一些轻量级的任务.
Reference
Linux Cron 定时任务 - 知乎 (zhihu.com)