Linux定时任务crond

Linux定时任务crond

Linux定时任务crond

  • crond 是Linux系统中用于设置周期性被执行的任务的工具。通过编辑crontab(cron table)文件,用户可以指定何时执行什么命令。crontab的语法非常直观,允许你指定分钟、小时、日、月、星期几来执行任务。

为什么要学习定时任务

  1. 临时文件清理
  2. 系统信息采集
  3. 日志文件切割
  4. 服务器时间同步
  5. 定时备份

定时任务配置

服务名字:crond daemon 守护进程

归纳解释

  • crond:是Linux系统中负责执行定时任务的守护进程(daemon)。它根据预先设定的时间表自动执行脚本或命令。
  • 守护进程(daemon):是一种在后台运行的程序,通常与终端无关,用于执行系统维护任务或等待处理来自其他程序或用户的请求。crond就是一个典型的守护进程,它不断监听时间变化,并在特定时间触发相应的任务。

在Linux系统中,crond服务默认安装并启动。通过编辑/etc/crontab或用户的crontab文件(使用crontab -e命令),可以添加定时任务。例如,设置每天凌晨1点自动清理临时文件的任务,就可以通过crond来实现。

Linux系统中PATH的作用

  • PATH变量:是Linux系统中一个非常重要的环境变量,它包含了一系列目录的路径,这些目录被系统用来查找用户输入的命令的可执行文件。
  • 作用:当用户在命令行输入一个命令时,系统会按照PATH变量中设置的目录顺序进行搜索,找到第一个匹配的可执行文件并执行它。如果PATH中没有包含命令所在的目录,则系统会提示“命令未找到”。

举例说明

假设/usr/local/bin目录下有一个名为myscript的脚本文件,并且该文件是可执行的。如果/usr/local/bin不在PATH变量中,那么用户直接输入myscript并回车时,系统会提示找不到该命令。为了能够在任何目录下都直接运行myscript,可以将/usr/local/bin添加到PATH变量中,方法是在用户的shell配置文件中(如.bashrc.bash_profile)添加export PATH=$PATH:/usr/local/bin

crond定时任务相关配置和示例

配置文件/etc/crontab

  • SHELL:指定执行定时任务时使用的shell,默认为/bin/bash

  • PATH:指定执行命令时搜索可执行文件的路径,默认为/sbin:/bin:/usr/sbin:/usr/bin

  • MAILTO:如果定时任务有输出(通常是错误或标准输出重定向到文件外的输出),则通过邮件发送给该变量指定的用户,默认为root

  • ## 配置文件
    [root@localhost.localdomain ~ 15:03:17 4.2 8]# vim /etc/crontab
    ## 定时任务中,动作可以使用bash命令
    SHELL=/bin/bash
    ## 在定时任务中,指定以下路径中的命令可以直接执行,不用写绝对路径 (规范:只要写定时任务所
    有命令都加上绝对路径执行)
    PATH=/sbin:/bin:/usr/sbin:/usr/bin
    ## 在定时任务执行后,如果有报错,就会当成邮件发送给root用户
    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
    ## 定时任务的语法
    * * * * *
    分 时 日 月 周
    0 - 59 0 - 23 1 - 31 1 - 12 0 - 6 or 1 - 7 周日(0 或 7

示例

  • 00 02 * * * ls 每天凌晨2点整执行ls命令
    00 02 1 * * ls 每个月的1号凌晨2点整执行ls命令
    00 02 14 2 * ls 每年的2月14号凌晨2点执行ls命令
    00 02 * * 7 ls 每周日凌晨2点执行ls命令 00 02 * * 0 ls
    00 02 * 6 5 ls 每年6月份每个周五凌晨2点执行ls命令
    00 02 14 * 7 ls 每个月14日并且是周日的那一天凌晨2点执行ls命令
    00 02 14 2 7 ls 每个2月14日刚好是周日的凌晨2点执行ls命令
    */10 02 * * * ls 每天的凌晨2点每10分钟执行一次ls命令
    * * * * * ls 每分钟执行一次ls命令 */1 * * * * ls
    00 00 14 2 * ls 每年2月14日的零点执行一次ls
    */5 * * * * ls 每5分钟执行一次ls
    00 02 * 1,5,8 * ls 每年的1月5月8月中每天凌晨2点执行一次ls
    00 02 1-8 * * ls 每个月的1号到8号凌晨2点执行一次ls
    0 21 * * * ls 每天晚上21点执行ls
    45 4 1,10,22 * * ls 每个月的1号 1022号的凌晨4点45分执行一次ls
    45 4 1-10 * * ls 每个月的1号到10号凌晨4点45分执行一次ls
    3,15 8-11 */2 * * ls 每2天的8点到11点的3分和15分执行一次ls
    0 23-7/1 * * * ls 23 0-7 每小时整点执行一次ls
    15 21 * * 1-5 ls 每周一到周五的9点15分执行ls
    

秒级任务

由于crond本身不支持秒级任务,如果需要实现秒级任务,可以通过编写shell脚本,结合while true循环和sleep命令来实现。例如,上面的shell脚本示例就是一个每秒执行一次echo 123的命令的简单秒级任务实现。

# crond定时任务最小级别就是分钟级,无法到秒级,想到秒级只能shell脚本
#!/bin/bash
while true;do
echo 123
sleep 1
done

定时任务命令

1.查看当前系统中有哪些定时任务

crontab -l cat /var/spool/cron/root 查看当前登录用户的定时任务

2.编辑定时任务

crontab -e vim /var/spool/cron/root 编辑当前登录用户的定时任务

3.清空定时任务

crontab -r

4.每个用户都有自己的定时任务, -u指定用户

[root@localhost.localdomain ~ 16:21:57 4.2 83]# crontab -l -u xxx
* * * * * ls

时间同步定时任务·

1.安装时间同步的命令

yum install -y ntpdate

2…同步阿里云时间同步服务器的时间

ntpdate ntp1.aliyun.com

3.编写定时任务 规范:作者 时间 作用

[root@localhost.localdomain ~ 16:44:00 4.2 133]# crontab -e

4.写入内容

# 作者:zls 时间:2024-8-12 作用:同步系统时间
*/5 * * * * /usr/sbin/ntpdate ntp1.aliyun.com &>/dev/null

案例:每天凌晨3点做一次备份

需求:将备份命令写入一个脚本中

格式化输出时间的方法

[root@localhost.localdomain / 17:26:02 4.2 139]# date +%F
2024-08-12
[root@localhost.localdomain / 17:26:07 4.2 140]# date +%Y
2024
[root@localhost.localdomain / 17:26:19 4.2 141]# date +%Y-%m
2024-08
[root@localhost.localdomain / 17:26:25 4.2 142]# date +%Y-%m-%d
2024-08-12
[root@localhost.localdomain / 17:26:33 4.2 143]# date +%F
2024-08-12
[root@localhost.localdomain / 17:26:38 4.2 144]# date +%H
17
[root@localhost.localdomain / 17:26:46 4.2 145]# date +%M
26
[root@localhost.localdomain / 17:26:57 4.2 146]# date +%S
02
[root@localhost.localdomain / 17:27:02 4.2 147]# date +%Y-%m-%d-%H:%M:%S
2024-08-12-17:27:42
[root@localhost.localdomain / 17:27:42 4.2 148]# date +%F-%T
2024-08-12-17:28:01

1.每天备份文件名要求格式:2024-08-12_web01_etc.tar.gz

tar zcf $(date +%F)_$(hostname)_etc.tar.gz etc/

2.存放备份内容的目录要求只保留3天的数据

find ./ ! -mtime -3|xargs rm -f

3.定时任务不识别有一些特殊符号当需要执行的命令,特殊符号多,命令长的时候,将命令写入脚本执行。

4.编写脚本

[root@localhost.localdomain ~ 00:09:32 4.2 199]# vim backup.sh
#!/bin/bash
mkdir -p /backup
/usr/bin/tar zcf /backup/$(date +%F)_$(hostname)_etc.tar.gz /etc/
find /backup ! -mtime -3|xargs rm -f

5.编写定时任务并要求在执行计划任务时,不要输出任务信息

[root@localhost.localdomain ~ 00:18:07 4.2 220]# crontab -e
# 作者:zls 时间:2024-8-12 作用:重要文件目录备份
00 3 * * * /bin/sh /root/backup.sh &>/dev/null

禁止指定用户使用定时任务

设置定时任务的黑名单


echo '用户名' >> /etc/cron.deny

定时任务调试思路

  1. 手动执行命令,然后保留执行成功的结果。

  2. 编写脚本

    • 脚本需要统一路径/scripts
    • 脚本内容复制执行成功的命令(减少每个环节出错几率)
    • 脚本内容尽可能的优化, 使用一些变量或使用简单的判断语句
    • 脚本执行的输出信息可以重定向至其他位置保留或写入/dev/null
  3. 执行脚本

    • 使用bash命令执行, 防止脚本没有增加执行权限(/usr/bin/bash)

    执行脚本成功后,复制该执行的命令,以便写入cron

  4. 编写计划任务

    • 加上必要的注释信息, 人、时间、任务
    • 设定计划任务执行的周期
    • 粘贴执行脚本的命令(不要手敲)
  5. 调试计划任务

    • 增加任务频率测试
    • 检查环境变量问题
    • 检查crond服务日志cat /var/log/cron
    • 动态查看tail -f /var/log/cron

简略版

1.了解定时任务的需求
2.在命令行执行命令满足需求
3.将正确的命令保存下来
4.如果命令复杂,则将命令放入脚本中
5.定时任务中使用绝对路径的命令来执行脚本
6.定时任务调整成每分钟执行的频率,方便调试
7.定时任务没有报错,执行成功后,再修改时间
tail -f /var/log/cron
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

晨曦中的四叶草

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值