跳到主要内容

crontab-linux定时任务

更新于:2023年12月6日

crontab-linux定时任务

目录

[toc]

文章推荐

https://onedayxyy.cn/docs/typora 《玩转Typora-永久更新地址》 QQ交流群

1、介绍

crontab 命令用于创建、编辑和管理用户的定时任务(cron jobs)。这些任务可以按照指定的时间表自动运行。

crontab是一种非常实用的时间任务调度工具,通过简单的设置,即可实现各种定时任务,非常适用于一些需要自动处理数据、批量操作等场景。

2、格式

crontab是用于设置定时任务的一种工具,每个定时任务都包含五个字段,分别为分钟、小时、日、月、星期。每个字段都有对应的取值范围,可以使用**单个取值、多个取值、递增取值**等方式进行设置。以下是几个常用的格式示例:

crontab 的格式为:分 时 日 月 星期 要运行的命令

# ┌───────────── 分钟 (0 - 59)
# │ ┌───────────── 小时 (0 - 23)
# │ │ ┌───────────── 月的某天 (1 - 31)
# │ │ │ ┌───────────── 月份 (1 - 12)
# │ │ │ │ ┌───────────── 周的某天 (0 - 6)(周日到周一;在某些系统上,7 也是星期日)
# │ │ │ │ │ 或者是 sun,mon,tue,web,thu,fri,sat
# │ │ │ │ │
# │ │ │ │ │
# * * * * *

# 分钟 小时 天 月 周
  • 第1列分钟 0~59
  • 第2列小时 0~23
  • 第3列日 1~31
  • 第4列月 1~12
  • 第5列星期 0~7(0和7表示星期天)
  • 第6列要运行的命令

案例汇总

##每几分钟
* * * * * command // 表示每分钟执行一次该命令
*/5 * * * * command // 表示每5分钟执行一次该命令

##每天
0 3 * * * command // 表示每天凌晨3点执行该命令

##每月
0 0 1 * * command // 表示每月1号凌晨0点0分执行该命令

##每周
0 0 * * 1 command // 表示每周一凌晨0点0分执行该命令

其中,星号(*)表示所有可能的值,斜杠(/)表示递增,逗号(,)表示多个取值,横线(-)表示取值范围。

注意:这里的command可以是linux命令或者shell脚本(要是绝对路径)。

案例1:基础脚本==(测试成功)==

san巡检脚本-2023.6.5

[root@localhost v3-2023.5.25]# crontab -e
30 8 * * * /root/Desktop/v3-2023.5.25/run.sh

[root@localhost v3-2023.5.25]# vim run.sh
#!/bin/sh
cd /root/Desktop/v3-2023.5.25
./main_Linux_20230530 &> /root/Desktop/v3-2023.5.25/output/`date +%F-%T`.log
[root@localhost v3-2023.5.25]# chmod 777 run.sh
[root@localhost v3-2023.5.25]# crontab -l
30 8 * * * /root/Desktop/v3-2023.5.25/run.sh

[root@localhost v3-2023.5.25]# ls output/
2023-06-05-11:15:32.log 2023-06-05-11:18:01.log
[root@localhost v3-2023.5.25]# ls
2023-05-25 2023_06_01 14-36-39_SAN_WarningInfo.txt check_2023-05-30 main_Linux_20230525
2023_05_25 16-21-14_SAN_WarningInfo.txt 2023-06-02 check_2023-05-31 main_Linux_20230530
2023-05-30 2023_06_02 10-06-00_SAN_WarningInfo.txt check_2023-06-01 output
2023_05_30 11-00-09_SAN_WarningInfo.txt 2023-06-05 check_2023-06-02 run.sh
2023-05-31 2023_06_05 11-16-12_SAN_WarningInfo.txt check_2023-06-05 sanInspect_Linux.zip
2023_05_31 15-38-52_SAN_WarningInfo.txt 2023_06_05 11-19-03_SAN_WarningInfo.txt config.yaml
2023-06-01 check_2023-05-25 fsmTemplates
[root@localhost v3-2023.5.25]#

39784c338fdcf55a085326af7fbe73b

案例2:docker容器==(测试成功)==

docker命令-2023.12.5

环境

centos7.9
  • 需求

我想把之前的docker.sh爬虫脚本,通过定期爬虫自己的onedayxyy.cn docusaurus知识库,从而让自己网站的algolia搜索内容更准确。

docker.sh爬虫脚本已经具备了,现在就是通过crontab实现一个定时脚本就行了。

  • 配置过程
chmod 777 docker.sh

crontab -e
0 0,6,12,18 * * * /root/docker.sh >> /var/log/crontab.log 2>&1
crontab -l
  • 但是,自己测试了几次没有现象啊……。。。

奇了怪了:。。。

难道是因为docker.sh原因吗。。。(好无语呀……)

[root@hexo-blog ~]# cat /root/docker.sh 
#!/bin/bash

cd /root
docker run -it --env-file=.env -e "CONFIG=$(cat docsearch.json | jq -r tostring)" algolia/docsearch-scraper

我脚本这里都测试过了,还是有问题:😭

0 0,6,12,18 * * * /root/docker.sh >> /var/log/crontab.log 2>&1 无效果

0 0,6,12,18 * * * sh /root/docker.sh >> /var/log/crontab.log 2>&1 无效果

45 11 * * * cd /root;docker run -it --env-file=.env -e "CONFIG=$(cat docsearch.json | jq -r tostring)" algolia/docsearch-scraper >> /var/log/crontab-record.log 无效果

  • 最后

经过大佬知道,给docker命令加上一个-d选项就行了

[root@hexo-blog ~]# cat docker.sh 
#!/bin/bash

cd /root
docker run -itd --env-file=.env -e "CONFIG=$(cat docsearch.json | jq -r tostring)" algolia/docsearch-scraper

crontab定时任务:

[root@hexo-blog ~]# crontab -l
0 0,6,12,18 * * * /root/docker.sh >> /var/log/crontab.log 2>&1
39 15 * * * /root/docker.sh >> /var/log/crontab.log 2>&1
  • 验证

[root@hexo-blog ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2c01626edede algolia/docsearch-scraper "pipenv run python -…" 26 seconds ago Up 25 seconds exciting_beaver

可以看到,符合预期,完美。😘

3、命令

1. 列出当前用户的定时任务

crontab -l

这将列出当前用户的所有定时任务。

2. 编辑当前用户的定时任务

该命令打开当前用户的crontab配置文件,可以添加新的任务、修改和删除已有的任务。

crontab -e

3. 添加定时任务

在编辑模式下,按照以下格式添加定时任务:

# 每天凌晨1点运行 my_script.sh
0 1 * * * /path/to/my_script.sh

# 每周一早上5点运行 another_script.sh
0 5 * * 1 /path/to/another_script.sh

# 每月1号午夜执行 cleanup.sh
0 0 1 * * /path/to/cleanup.sh

这些数字和星号代表了任务执行的时间。具体格式为:分钟(0-59) 小时(0-23) 日期(1-31) 月份(1-12) 星期几(0-6,其中0是星期日)。星号表示匹配任意值。

4. 从文件导入定时任务

如果您有一个包含定时任务的文件,可以使用以下命令导入:

crontab filename

其中 filename 是包含定时任务的文件名。

5. 移除所有定时任务

crontab -r

这将删除当前用户的所有定时任务。

6. 使用系统的 crontab 文件

有时,需要编辑系统范围的 crontab 文件,而不是用户特定的文件。在这种情况下,可以使用以下命令:

sudo crontab -e

请注意,这将使用超级用户权限编辑系统范围的 crontab 文件。

以上是一些 crontab 命令的使用案例。定时任务的时间表语法相对简单,但确保理解并检查任务是否按照您的期望运行是非常重要的。

4、常见问题

1. 如何调试crontab任务?

在crontab的命令行中,无法像普通命令一样直接输出结果。因此,如果需要调试任务,可以在任务中将输出重定向到指定的文件。

* * * * * command > /tmp/command.log 2>&1

其中,2>&1 表示将错误信息输出到标准输出中。

2. crontab任务执行失败怎么办?

crontab任务执行失败的原因可能有很多,比如command命令路径不对,权限不够等。为了方便排查问题,可以在crontab命令中添加日志记录功能。

* * * * * command >> /var/log/crontab.log 2>&1

将日志记录到指定的文件后,就可以通过查看日志文件来定位问题并修复了。

3. crontab任务怎么调整执行次数?

crontab中的任务只会按照设定的时间执行一次,如果需要在某一段时间内执行多次,可以使用while循环。

* * * * * while true; do command; sleep 30; done

命令中的 while true 表示一直循环执行,每次执行后等待30秒再继续循环。

参考

https://www.python100.com/html/F0BY44BU18A1.html#title-4

关于我

我的博客主旨:

  • 排版美观,语言精炼;
  • 文档即手册,步骤明细,拒绝埋坑,提供源码;
  • 本人实战文档都是亲测成功的,各位小伙伴在实际操作过程中如有什么疑问,可随时联系本人帮您解决问题,让我们一起进步!

🍀 微信二维码 x2675263825 (舍得), qq:2675263825。

image-20230107215114763

🍀 微信公众号 《云原生架构师实战》

image-20230107215126971

🍀 个人博客站点

http://onedayxyy.cn/

🍀 语雀

https://www.yuque.com/xyy-onlyone

🍀 csdn

https://blog.csdn.net/weixin_39246554?spm=1010.2135.3001.5421

image-20230107215149885

🍀 知乎

https://www.zhihu.com/people/foryouone

image-20230107215203185

最后

好了,关于本次就到这里了,感谢大家阅读,最后祝大家生活快乐,每天都过的有意义哦,我们下期见!