Linux计划任务(crontab)

server/2025/1/22 8:59:27/

Linux计划任务(crontab)

  • 计划任务(crontab)
  • 周期性任务计划 cron
    • 系统cron任务
    • 用户cron任务
    • cron 程序日志文件
    • cron 时间表示法
  • 示例
    • 创建cron任务
    • 查看cron任务
    • 查看执行日志
    • crontab命令
    • 环境变量问题
    • 其他

计划任务(crontab)

计划任务(crontab)是指在Linux系统中,利用cron(crond)这个系统服务来控制的定时执行工具,它允许用户创建和管理计划任务,以便在特定的时间间隔或时间点自动运行命令或脚本。
Crontab是cron table的缩写,其中cron是Unix系统中的一个后台进程,用于执行预定的任务。Crontab文件包含一系列计划任务条目,每个条目都定义了一个任务的执行时间和要运行的命令或脚本。这些任务可以按照分钟、小时、日、月和星期等不同的时间单位进行安排。

[root@localhost logs]# cat /etc/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

周期性任务计划 cron

cron 依赖于 crond 服务,确保 crond 守护处于运行状态:

#CentOS 7 以后版本
systemctl status crond#CentOS 6 版本
service crond status

系统cron任务

cron任务分为系统级任务和用户级任务

操作系统自带的cron 任务,系统维护作业,/etc/crontab 主配置文件, /etc/cron.d/ 子配置文件
系统cron任务是操作系统自己调用的任务,与用户无关如果想添加系统级的cron任务,写在此文件中。/etc/crontab。
系统cron任务相关文件

/etc/crontab #配置文件
/etc/cron.d/ #配置文件
/etc/cron.hourly/ #脚本
/etc/cron.daily/ #脚本
/etc/cron.weekly/ #脚本
/etc/cron.monthly/ #脚本

用户cron任务

每个用户自己名下的 cron 任务
红帽系统保存在 /var/spool/cron/USERNAME,
Ubuntu 系统存放在/var/spool/cron/crontabs/USERNAME,利用 crontab 命令管理

cron 程序日志文件

ll /var/log/ | grep cron

cron 时间表示法

字段可以是星号(*),表示该字段的每个值都有效;也可以是具体的数值,表示仅在该值时才有效;还可以是逗号分隔的列表,表示列表中的每个值都有效;以及连字符表示的范围,例如 10-12 表示小时 10、11、12。

注意:crontab定时任务支持的最小单位是分钟级,即最小周期为每分钟执行一次,如果需要更小的粒度(如秒级),请使用其他方法实现。

# * 表示该位置上所有可以出现的值
* * * * *  #每分钟执行一次
1 2 * * *  #每天2时1分执行一次# , 表示该位置上多个值
1,3,5 2,4,6 * * *  #表示第2,4,6这三个小时中每个小时的第1,3,5分的时候执行一次# - 表示范围取值
1-5 2-6 * * *  #表示第2到第6小时,第时的第1到第5分每分钟执行一次# / 表示频率,步长
*/5 * * * *  #每5分钟执行一次
* */5 * * *  #每5小时执行一次# 综合用法
*/5 1,3,5-8 * * 2,4  #每周2和每周4的第1时,第3时,第5到8时,每5分钟执行一次 
1 2 1-10 * 1-5  #每月的1到10日,或每周1到周五的2时1分执行一次
1-30/5 * * * *  #每小时1-30分内,每5分钟执行一次#一些示例
*/5 * * * *  #每五分钟执行
0 * * * *    #每小时执行 
0 0 * * *    #每天执行   
0 0 * * 0    #每周执行   
0 0 1 * *    #每月执行   
0 0 1 1 *    #每年执行   #特定关健字
@yearly  #每年1月1日执行一次,相当于 0 0 1 1 *
@annually  #每年1月1日执行一次,相当于 0 0 1 1 *
@monthly  #每月1日执行一次,相当于 0 0 1 * *
@weekly  #每周日执行一次,相当于 0 0 * * 0
@daily  #每天0时执行一次,相当于 0 0 * * *
@hourly  #每小时0分执行一次,相当于 0 * * * *
@reboot  #重启后执行一次

示例

创建cron任务

语法

[cron时间表达式] [user](指定哪个用户来执行定时任务(可忽略)) [command(要执行的命令或脚本)]

输入 crontab -e 命令,按 i 键进入编辑模式,然后输入下面的脚本。输入完成之后保存退出。

*/2 * * * * /data/wan/logs/asd.sh

这个脚本的意思是,2分钟执行一次asd.sh。

输入 crontab -l 命令,可以看到当前用户下的所有定时任务。-e指令表示进入可编辑状态。

[root@localhost logs]# cat asd.sh 
date_str=$(date +%Y-%m-%d_%H-%M-%S)
cp /data/wan/logs/wae.txt /data/wan/logs/wae_${date_str}.txt.bak
echo ${date_str}" cp finish..."

cron 任务中的标准输入输出会发送邮件到用户邮箱,对应文件是: /var/spool/mail/root。 如果想将提示写在其他文件,则可以在定时任务中加上重定向。
将脚本的输出内容写入到文件,log.log。如果不存在就创建一个。若当前任务是root用户,则日志路径是/root/log.log。若任务是hdfs用户,则日志路径是/hdfs/log.log。

*/2 * * * * /data/wan/logs/asd.sh >> log.log
*/2 * * * * /data/wan/logs/asd.sh >> ./log.log

如果要创建在其他目录,写个绝对路径就行。

*/2 * * * * /data/wan/logs/asd.sh >> /data/log.log

查看cron任务

在终端输入 crontab -l 指令,就能查看当前用户下,在执行的定时任务。
若当前是root用户, crontab -l 相当于 cat /var/spool/cron/root。 同样的,若当前是hdfs用户, crontab -l 相当于 cat /var/spool/cron/hdfs。
所以 crontab -e 相当于 vim /var/spool/cron/root。 crontab -r 相当于 rm -f /var/spool/cron/root。 crontab -ir 相当于 rm /var/spool/cron/root。

如果不想永久删除也可以在定时任务前添加 # 注释掉该任务即可,添加注释的定时任务会被忽略。

查看执行日志

cat /var/log/cron

还有其他日期结尾的日志。

[root@localhost log]# ll | grep cron
-rw-------. 1 root   root     10691 120 17:49 cron
-rw-------. 1 root   root     17313 12 11:34 cron-20250102
-rw-------. 1 root   root     26107 113 11:24 cron-20250113
-rw-------. 1 root   root      5242 120 12:25 cron-20250120

crontab命令

  • 每个用户都有专用的cron任务文件:/var/spool/cron/crontabs/USERNAME
  • 默认标准输出和错误会被发邮件给对应的用户,如:hdfs用户创建的任务就发送至hdfs的邮箱
  • root能够修改其它用户的作业
  • 用户的cron中默认 PATH=/usr/bin:/bin,如果使用其它路径,在任务文件的第一行加PATH=/path或者加入到计划任务执行的脚本中
  • 第六个字段指定要运行的命令。该行的整个命令部分,直至换行符或“%”字符,指定的shell执行,除非使用反斜杠(\)进行转义,否则该命令中的“%”字符将变为换行符,并且第一个%之后的所有数据将作为标准输入发送到该命令
crontab [-u user] [-l | -r | -e] [-i]#常用选项
-l #列出所有任务
-e #编辑任务
-r #移除所有任务
-i #同-r一同使用,以交互式模式移除指定任务
-u user #管理特定用户的cron,仅root有权限操作

环境变量问题

有时我们创建了一个 crontab ,但是这个任务却无法自动执行,而手动执行这个任务却没有问题,这种情况一般是由于在 crontab文件中没有配置环境变量引起的。

在 crontab 文件中定义多个调度任务时,需要特别注意的一个问题就是环境变量的设置,因为我们手动执行某个任务时,是在当前 shell 环境下进行的,程序当然能找到环境变量,而系统自动执行任务调度时,是不会加载任何环境变量的,因此,就需要在 crontab 文件中指定任务运行所需的所有环境变量,这样,系统执行任务调度时就没有问题了。
cron 不知道所需要的特殊环境。所以要保证在 shell脚本中提供所有必要的路径和环境变量,除了一些自动设置的全局变量。所以注意如下4点:

# 脚本中涉及文件路径时写全局路径;# 检查用户是否有执行脚本的权限# 脚本执行要用到java或其他环境变量时,通过 `source` 命令引入环境变量,如:
#!/bin/sh
source /etc/profile
export RUN_CONF=/home/d139/conf/platform/cbp/cbp_jboss.conf
/usr/local/jboss-4.0.5/bin/run.sh -c mev &#  当手动执行脚本OK,但是 `crontab` 死活不执行时。这时可能是环境变量惹的祸,并可以尝试在 `crontab`中直接引入环境变量解决问题。
0 * * * * . /etc/profile;/bin/sh /var/www/java/audit_no_count/bin/restart_audit.sh

其他

如果任务创建后,没有成功执行,可以看看crond服务状态 service crond status

service crond start #启动服务
service crond stop #关闭服务
service crond restart #重启服务
service crond reload #重新载入配置

http://www.ppmy.cn/server/160410.html

相关文章

频繁刷新网页会对服务器造成哪些影响?

当用户在进行浏览网页的过程中频繁刷新页面时,浏览器会向服务器发送请求,服务器会对该请求进行处理并返回到相应的页面内容中,所以频繁刷新网页会对服务器造成影响,有可能会出现以下问题: 用户每次刷新网页都会向服务器…

在VS2022中用C++连接MySQL数据库读取数据库乱码问题

1.正确安装mysql 安装之后的配置文件 2.在VS2022中进行相关配置 (1)右键项目,打开属性 注意是右键项目,不是.cpp文件 (2)配置属性-> VC目录 -> 包含目录 ->添加头文件路径(如图&am…

CSS语言的数据类型

CSS数据类型详解 CSS(层叠样式表)作为网页设计中的重要组成部分,主要用于控制网页的布局、样式和外观。CSS的强大之处在于其丰富的数据类型,这些数据类型决定了我们如何在网页上应用样式。本文将详细介绍CSS的各种数据类型&#…

Whisper-GPT:混合表征音频大语言模型

Whisper-GPT:混合表征音频大语言模型 当下,利用从神经压缩算法(例如#Encodec#​)派生的离散音频标记的生成式音频、语音以及音乐模型数量激增。然而,这种方法的主要缺陷之一在于对上下文长度的处理。如果必须考虑所有不同频率的音频内容才能进行下一个标记预测,那么高保…

去哪儿kafka优化案例

一、背景介绍 集群概况 去哪儿旅行当前KAFKA日志集群节点145台。单机配置:3TSSD盘,40核,128G内存。 业务背景 日志KAFKA集群承载了全司的APPCODE日志,比如我们常用的QTRACE日志,以及实时离线数仓数据。体量非常大。…

实现一个自己的spring-boot-starter,基于SQL生成HTTP接口

上一篇博文介绍了Spring Boot Starter,这次我们就实现一个自己的starter模块,引入了该模块,项目就自然具有了通过配置SQL自动生成HTTP接口的能力。 完整代码可以到github下载:https://github.com/chengpei/sqlapi-spring-boot-sta…

win32汇编环境,窗口程序中复杂列表框的应用举例

;运行效果 ;双击到根目录后 ;win32汇编环境,窗口程序中复杂列表框的应用举例 ;在窗口程序中生成复杂列表框,增加子项,删除某项,取得指定项内容,在列表框内展示某文件夹内的文件列表,选定某文件夹后双击打开,返回上层目录再打开等 ;直接抄进RadAsm可编译运行。重点部分加备…

天机学堂7--Redisson自定义注解AOP以及SPEL表达式实现分布式锁

文章目录 集群下的锁失效问题Redis中的setnx命令实现分布式锁setnx基本原理死锁问题利用Redis实现的简单分布式锁流程setnx的分布式锁的问题锁误删问题超时释放问题其它问题 Redisson基于注解的分布式锁工厂模式 选择锁类型策略模式提供 重试策略 失败策略组合基于SPEL的动态锁…