Linux中的计划任务—Crontab调度重复执行的任务

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: Linux中的计划任务—Crontab调度重复执行的任务

目标


本博文的主要目的是让笔者和读者可以了解并掌握以下内容:

1、Crontab的基本概念

2、Crontab的基本组成

3、操作Crond服务

4、配置系统和用户计划任务

5、监控计划任务日志


背景介绍



aHR0cDovL2ltZy5ibG9nLmNzZG4ubmV0LzIwMTYwOTA2MTkxMjE3MzA1.png


在工作中你是否也碰到过这种定时重复的工作呢?

Crontab可以帮助你从这些定时重复的工作中解脱出来


Crontab是什么


aHR0cDovL2ltZy5ibG9nLmNzZG4ubmV0LzIwMTYwOTA2MTkxNTEwMzU4.png



  • 1.Crontab是一个用于设置周期性执行任务的工具;
  • 2.周期性执行的任务我们称为Cron Job;
  • 3.周期性执行的任务列表我们称为Cron Table。


Crontab实践

安装并检查Crontab服务


安装并检查crontab服务


1、检查cron服务:


– 检查crontab工具是否安装:crontab -l

– 检查crond服务是否启动:service crond status


2、安装cron


– yum install vixie-cron

– yum install crontabs

注意:

1、检查crontab服务状态:service crond status

控制服务的一些提示:service crond

2、检查Apache(阿帕奇)服务状态:service httpd status

控制服务的一些提示:service httpd

(检查服务状态,服务名后面一般都加d,如crond、httpd)

aHR0cDovL2ltZy5ibG9nLmNzZG4ubmV0LzIwMTYwOTA2MTkxODM0OTA3.png


案例实现

每分钟都打印当前时间到一个文件中

service crond status #查看服务是否启动<br>
service crond start #如没有启动服务,启动服务<br>
crontab -l  #查看当前定时任务列表<br>
crontab -e  #打开定时任务列表文件,进行编辑<br>
*/1 * * * * date >> /tmp/log.txt  #在最后一行插入内容,保存退出(注意*间的空格)<br>
tail -f /tmp/log.txt  #监听log.txt文件内容(动态刷新)
date #查看当前时间


Crontab的基本组成

aHR0cDovL2ltZy5ibG9nLmNzZG4ubmV0LzIwMTYwOTA2MTkyNDQyMzYy.png


crontab的基本组成:

  • 1)系统服务CROND:
    每分钟都会从配置文件刷新定时任务
  • 2)配置文件:
    文件方式设置定时任务
  • 3)配置工具crontab:
    用于调整定时任务


Crontab的配置文件格式



aHR0cDovL2ltZy5ibG9nLmNzZG4ubmV0LzIwMTYwOTA2MTkyODM1NTIw.png


小栗子

eg1.每晚的21:30重启apache

30 21 * * * service httpd restart

eg2.每月1,10,22日的4:45重启apache

45 4 1,10,22 * * service httpd restart

eg3.每月1-10日的4:45重启apache

45 4 1-10 * * service httpd restart

eg4.每隔两分钟重启apache

*/2 * * * * service httpd restart
1-59/2 * * * * service httpd restart(奇数分钟重启)
 0-58/2 * * * * service httpd restart(偶数分钟重启)


eg5.每晚11-早上7点之间,每隔一个小时重启apache

* 23-7/1 * * * service httpd restart


eg6.每天18:00-23:00之间每隔30分钟重启apache

0,30 18-23 * * * service httpd restart
0-59/30 18-23 * * * service httpd restart



aHR0cDovL2ltZy5ibG9nLmNzZG4ubmV0LzIwMTYwOTA2MTkyOTQ5NTk4.png


aHR0cDovL2ltZy5ibG9nLmNzZG4ubmV0LzIwMTYwOTA2MTkzMDQ5MDM1.pngaHR0cDovL2ltZy5ibG9nLmNzZG4ubmV0LzIwMTYwOTA2MTkzMTQ0Nzg2.png

Crontab工具的使用


通过 man crontab 或者 crontab --help 查看


1、查看某用户的计划任务列表:


crontab -u 用户名 -l(默认-u为当前登录用户)


2、修改某用户的计划任务:


crontab -e


3、删除crontab文件


crontab -r [username]


root可以指定用户删除其他用户的crontab文件。 其他用户只可以删除自己的crontab文件


4、查看生成的最终计划任务文件:

/var/spool/cron


5、crontab日志位置:

/var/log/cron


Crontab的配置文件


aHR0cDovL2ltZy5ibG9nLmNzZG4ubmV0LzIwMTYwOTA2MTk1NDMwMzky.png

1、用户的crontab定时任务保存文件:

/var/spool/cron/root

或者:/var/spool/cron/tabs/root

2、全局(系统)配置文件:

– /etc/crontab

– 注意格式


1.利用命令crontab -e 进入的是用户级别的计划任务


2.用 vi /etc/crontab 进入后编辑的是系统级的计划任务

aHR0cDovL2ltZy5ibG9nLmNzZG4ubmV0LzIwMTYwOTA2MjAyNTIyNTc0.png

cd /etc
ls cron*
tail -f /var/log/cron(任务执行日志)
crontab -e实际上是在修改目录/var/spool/cron/root下的用户对应的文件
cd /etc/cron.d
vi sysstat
crontab sysstat
crontab 文件名 会把(crontab -e)文件里的内容都覆盖 ,所以要非常小心
crontab -l -u crontester查找某个用户下的定时程序
cron.d可以认为是对系统级配置的补充,crontab -l,crontab -e看不到,编辑不了cron.d里的配置
可以在该文件夹下自己创建 
vi crontest
*/1 * * * * echo 'file in cron.d/crontest'
tail -f /var/log/cron


Crontab的日志

  • /var/log/cron 保存着所有的crontab的操作
  • /var/spool/mail/ 下也会以邮件的方式发送日志信息


Crontab的常见错误


Crontab的常见错误之环境变量


不可引用环境变量

cd ~


ls -a

可以看到有.bash_profile文件

vim .bash_profile

新增一个环境变量

--------------
APPDIR=/ect
export APPDIR
-----------------


更新到环境变量:

source .bash_profile


检验:

echo $APPDIR 可以正常显示,能够被识别

但是在下面这条命令行添加在crontab里不能被识别

*/1 * * * * echo $APPDIR >> /tmp/appdir.log


在/var/log/cron任务执行日志中可以看到,但是cat打开/tmp/appdir.log内容是空的


Crontab的常见错误之命令行操作


1、test 表达式 测试后面的表达式是否真实,但必须加空格 (如果不加空格,那么该命令恒为正确的。)例如: test 1 = 0 如果结果是0 ,那么是正确的(与C语言相反)

2.通过echo $?来查看上一次的执行结果。

3、date +%w 这个是显示今天是星期几

4、需要注意的是在crontab文件中,%需要进行转义


第三个和第五个域之间执行的是或操作 即 星期几和每月几号是或关系

例:4月的第一个星期日早晨1时59分运行a.sh


①59 1 1-7 4 0 /root/a.sh 错误的写法

②59 1 1-7 4 * testdate +%w-eq 0 && /root/a.sh 正确的写法


aHR0cDovL2ltZy5ibG9nLmNzZG4ubmV0LzIwMTYwOTA2MjA0NjU2Njg0.png

Crontab的常见错误之分钟设置误用


两小时运行一次date命令

错误:

* 0,2,4,6,8,10,12,14,16,18,20,22 * * * date


正确:

0 */2 * * * date


Crontab综合案例解析

aHR0cDovL2ltZy5ibG9nLmNzZG4ubmV0LzIwMTYwOTA2MjA1MjM0MzU0.png


crontab最小时间是1分钟,控制1分钟执行多次

本应该是同时执行,但第二条被推迟了30s执行,效果就是1分钟执行了2次

*/1 * * * * date>>/root/test/half.log
*/1 * * * * sleep 30s;date>>/root/test/half.log

&& 和|| 和 ;的区别


command1 && command2: &&左边的command1执行成功(返回0表示成功)后,&&右边的command2才能被执行。

command1 || command2: 如果||左边的command1执行失败(返回1表示失败),就执行&&右边的command2。

command1;command2: 命令顺序执行,不管前面的是否正确后面的都会依次执行


定时备份oracle数据

#!/bin/bash
export ORACLE_BASE=/data/oracle
export ORACLE_HOME=/oracle/product/102
export ORACLE_SID=sidname
export ORACLE_TERM=xterm
export PATH=$ORACLE_HOME/bin:/usr/sbin:$PATH
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib
export LANG=C
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
#以上代码为Oracle数据库运行账号oracle的系统环境变量设置,必须添加,否则crontab任务计划不能执行。
date=date +%Y_%m_%d   #获取系统当前日期时间
days=5  #设置删除5天之前的备份文件
orsid=ip:port/sidname #Oracle数据库服务器IP、端口、SID
orowner=master_ccpx2  #备份此用户下面的数据
bakuser=master_ccpx2   #用此用户来执行备份,必须要有备份操作的权限
bakpass=passwd  #执行备注的用户密码
bakdir=/aaa/bbb/oracle_data  #备份文件路径,需要提前创建好
bakdata=$orowner"_"$date.dmp #备份数据库名称
baklog=$orowner"_"$date.log #备份执行时候生成的日志文件名称
ordatabak=$orowner"_"$date.tar.gz #最后保存的Oracle数据库备份文件
cd $bakdir #进入备份目录
mkdir -p $orowner #按需要备份的Oracle用户创建目录
cd $orowner #进入目录
exp $bakuser/$bakpass@$orsid grants=y owner=$orowner file=$bakdir/$orowner/$bakdata log=$bakdir/$orowner/$baklog #执行备份
tar -zcvf $ordatabak $bakdata  $baklog  #压缩备份文件和日志文件
find $bakdir/$orowner  -type f -name "*.log" -exec rm {} \; #删除备份文件
find $bakdir/$orowner  -type f -name "*.dmp" -exec rm {} \; #删除日志文件
find $bakdir/$orowner  -type f -name "*.tar.gz" -mtime +$days -exec rm -rf {} \;  #删除5天前的备份


相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
9天前
|
监控 安全 Linux
在 Linux 系统中,网络管理是重要任务。本文介绍了常用的网络命令及其适用场景
在 Linux 系统中,网络管理是重要任务。本文介绍了常用的网络命令及其适用场景,包括 ping(测试连通性)、traceroute(跟踪路由路径)、netstat(显示网络连接信息)、nmap(网络扫描)、ifconfig 和 ip(网络接口配置)。掌握这些命令有助于高效诊断和解决网络问题,保障网络稳定运行。
30 2
|
16天前
|
人工智能 算法 大数据
Linux内核中的调度算法演变:从O(1)到CFS的优化之旅###
本文深入探讨了Linux操作系统内核中进程调度算法的发展历程,聚焦于O(1)调度器向完全公平调度器(CFS)的转变。不同于传统摘要对研究背景、方法、结果和结论的概述,本文创新性地采用“技术演进时间线”的形式,简明扼要地勾勒出这一转变背后的关键技术里程碑,旨在为读者提供一个清晰的历史脉络,引领其深入了解Linux调度机制的革新之路。 ###
|
18天前
|
算法 Linux 定位技术
Linux内核中的进程调度算法解析####
【10月更文挑战第29天】 本文深入剖析了Linux操作系统的心脏——内核中至关重要的组成部分之一,即进程调度机制。不同于传统的摘要概述,我们将通过一段引人入胜的故事线来揭开进程调度算法的神秘面纱,展现其背后的精妙设计与复杂逻辑,让读者仿佛跟随一位虚拟的“进程侦探”,一步步探索Linux如何高效、公平地管理众多进程,确保系统资源的最优分配与利用。 ####
52 4
|
19天前
|
缓存 负载均衡 算法
Linux内核中的进程调度算法解析####
本文深入探讨了Linux操作系统核心组件之一——进程调度器,着重分析了其采用的CFS(完全公平调度器)算法。不同于传统摘要对研究背景、方法、结果和结论的概述,本文摘要将直接揭示CFS算法的核心优势及其在现代多核处理器环境下如何实现高效、公平的资源分配,同时简要提及该算法如何优化系统响应时间和吞吐量,为读者快速构建对Linux进程调度机制的认知框架。 ####
|
28天前
|
Linux
Linux Crontab 查看定时任务启动没
【10月更文挑战第20天】在Linux系统中,crontab用于设置周期性执行的任务。查看当前用户的Crontab任务列表,使用`crontab -l`;查看所有用户任务,使用`sudo crontab -l`或指定用户`sudo crontab -u username -l`。
51 5
|
2月前
|
消息中间件 分布式计算 Java
Linux环境下 java程序提交spark任务到Yarn报错
Linux环境下 java程序提交spark任务到Yarn报错
44 5
|
3月前
|
资源调度 监控 网络协议
在Linux中,如何进行系统资源调度?
在Linux中,如何进行系统资源调度?
|
3月前
|
监控 Linux 调度
在Linux中,如何进行调度任务?什么是 crontab 并解释 crontab 中的字段?
在Linux中,如何进行调度任务?什么是 crontab 并解释 crontab 中的字段?
|
2月前
|
Linux 调度
linux中几种任务的优先级
linux中几种任务的优先级
|
3月前
|
负载均衡 算法 Linux
在Linux中,LVS的负载调度算法是什么?
在Linux中,LVS的负载调度算法是什么?