在 Docker 容器内集成 Crontab 定时任务

news/2024/4/26 5:31:09/文章来源:https://blog.csdn.net/qinyuanpei/article/details/128091119

本文内容

  • Crontab 基础知识
  • Crontab 日志问题
  • 参考链接

有时候,我们需要在容器内执行某种定时任务。譬如,Kerberos 客户端从 KDC 中获取到的 TGT 默认有效期为 10 个小时,一旦这个票据失效,我们将无法使用单点登录功能。此时,我们就需要一个定时任务来定时刷新票据。此前,博主为大家介绍过 Quartz 和 Hangfire 这样的定时任务系统,而对于 Linux 来说,其内置的 crontab 是比以上两种方案更加轻量级的一种方案,它可以定时地去执行 Linux 中的命令或者是脚本。对应到 Kerberos 的这个例子里面,从 KDC 申请一个新的票据,我们只需要使用 kinit 这个命令即可。因此,在今天这篇博客里,我想和大家分享一下,如何在 Docker 容器内集成 Crontab 定时任务,姑且算是在探索 Kerberos 过程中的无心插柳,Kerberos 认证这个话题博主还需要再消化一下,请大家拭目以待,哈哈!

Crontab 基础知识

众所周知,Linux 中的所有内容都是以文件的形式保存和管理的,即:一切皆为文件。那么,自然而然的地,Linux 中的定时任务同样遵循这套丛林法则,因此,当我们谈论到在 Linux 中执行定时任务这个话题的时候,本质上依然是在谈论某种特定格式的文件。事实上,这类文件通常被称为 crontab 文件,这是一个来源于希腊语 chronos 的词汇,其含义是时间。Linux 会定时(每分钟)读取 crontab 文件中的指令,检查是否有预定任务需要执行。下面是一个 crontab 文件的示例:

# 每分钟执行一次 ls 命令
* * * * * /bin/ls
# 周一到周五的下午5点发邮件
0 17 * * 1-5 mail -s "hi" alex@162.com
# 每月1号和15号执行脚本
0 0 1,15 * * /var/www/newbee/check.sh
# 00:20、02:20、04:20...执行 echo 命令
20 0-23/2 * * * echo "hello"

可以注意到,crontab 文件就像是一份写给 Linux 的日程表,它会告诉 Linux 每个时刻应该做什么样的事情。虽然这些事情看起来都显得琐碎繁复,甚至都精确到了每一分钟,可如果我们观察得足够仔细的话,就会发现这些定时任务都可以用下面的形式来表示,即:

* * * * * <program> 

其中,<program> 可以是一个命令或者脚本,而对于 <program> 前面的这部分,我们通常将其称为 cron 表达式,其含义定义如下:

*    *    *    *    *
-    -    -    -    -
|    |    |    |    |
|    |    |    |    +----- 星期(0 - 6)
|    |    |    +---------- 月份(1 - 12) 
|    |    +--------------- 日期(1 - 31)
|    +-------------------- 小时(0 - 23)
+------------------------- 分钟(0 - 23)

例如,49 19 24 11 * 这串神秘代码表示的是:11 月 24 日 19 时 49 分,在此基础上,当第一位为 * 时,表示每分钟都执行 <program> ;当第一位为 a-b 时,表示在 a 分钟到 b 分钟这段时间内执行 <program> ;当第一位为 */n 时,表示每隔 n 分钟执行一次 <program> ;当第一位为 a,b,c… 时表示第 a、b、c…分钟时执行一次 <program> 。依次类推,我们可以在不同的时间单位上使用这些表达式。例如:

# 每周六晚上00:00
0 0 * * 6
# 每周六和周天晚上00:00
0 0 * * 0,6
# 每周六和周天晚上00:00 ~ 04:00
0 0-4 * * 0,6
# 每周六和周天晚上00:00 和 01:00 执行
0 0,1 * * 0,6
# 每周六和周天晚上每隔两个小时执行一次
0 */2 * * 0,6

现在,回到我们一开始的问题,如何通过定时任务来解决 Kerberos 票据过期的问题呢?首先,我们准备一个名为 renew.sh 的脚本,这是一个非常简单的脚本,无论你是否接触过 Kerberos,是否了解 Principal 或是 SPN 这些概念,你都可以轻而易举地上手:

echo [$(date)] 'request a new ticket for HTTP/web.your-domain.com@YOUR-DOMAIN.COM'
kinit -kt /etc/apache2/krb-container.keytab HTTP/web.your-domain.com@YOUR-DOMAIN.COM

接下来,我们只需要在真正的 crontab 文件里引用这个脚本即可,从上面的表达式定义出发,我们可以知道,这个定时任务每隔 10 分钟执行一次:

cronfile='/usr/crontab/cron.conf'
renewTicket='*/10 * * * * /usr/crontab/renew.sh'
echo "$renewTicket" | tee -a $cronfile
crontab $cronfile
/etc/init.d/cron reload
/etc/init.d/cron restart

这里运用到的第一个技巧是 crontab 命令,它可以生成、编辑、删除、列举定时任务:

# 生成定时任务
crontab <-u user> file
# 编辑定时任务
crontab <-u user> -e
# 删除定时任务
crontab <-u user> -r
# 列举定时任务
crontab <-u user> -l

在本文的示例中,博主没有指定 -u 这个参数,这是因为博主使用的是 root 用户。事实上,在指定了编辑器的情况下,你可以使用 -e 参数通过交互式的命令行来编写定时任务:

# 使用 vim 作为 crontab 的编辑器
export EDITOR="/usr/bin/vim"
crontab -e 

此时,我们就可以通过 vim 修改这份 crontab 文件。相信此时此刻,你会有一种感觉,这个 crontab 文件不就是一份由 cron 表达式组成的日程表吗?事实上,Linux 系统会维护一份 crontab 文件,我们自己编写的 crontab 文件会在执行 crontab 命令后合入到这份 crontab 文件里:

在这里插入图片描述

需要注意到的是,当我们在 Docker 容器内执行定时任务时,需要确保生成定时任务的这部分脚本,在容器的入口位置被执行,简而言之,我们应该有一个名为 entrypoint.sh 的脚本,并用它来替代容器的默认入口:

CMD ["sh", "/usr/docker/entrypoint.sh"]

一旦定时任务被创建出来,我们总是可以使用 crontab -l 命令列举出当前用户下有哪些定时任务:

在这里插入图片描述

Crontab 日志问题

在这个过程中,博主发现一个问题,那就是看不到这些定时任务的执行日志。通常,这些日志位于以下路径:/var/log/cron.log,我们可以使用下面的命令:

tail -f /var/log/cron.log

此时,我们会得到下面的错误,显然,这是日志没有写入的缘故:

在这里插入图片描述

在尝试安装 rsyslog 以及修改配置启用定时任务日志后,该问题依然存在:

sudo apt-get install -y rsyslog;
sudo vim /etc/rsyslog.d/50-default.conf;

有趣的是,这个做法在 Ubuntu 最新版本中是生效的,而两者的区别是:前者是容器,后者是虚拟机。

在这里插入图片描述

吾上下求索而不得,最终采用下面的方案来解决,即直接重定向脚本输出到容器的标准输出:

echo [$(date)] 'Hello' > /proc/1/fd/1

此时,我们就可以在容器中看到对应的日志,虽然这只是一个小问题,可个人感觉还是挺折腾人的:

在这里插入图片描述

参考链接

  • 如何在 Docker 中执行 Crontab
  • How to Setup Rsyslog Server on Debian 11 (Bullseye)
  • Understanding Crontab in Linux With Examples
  • What Is Cron Job

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_227347.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深度学习入门(五十七)循环神经网络——循环神经网络从零开始实现

深度学习入门&#xff08;五十七&#xff09;循环神经网络——循环神经网络从零开始实现前言循环神经网络——循环神经网络从零开始实现教材1 独热编码(one-hot)2 初始化模型参数3 循环神经网络模型4 预测5 梯度裁剪6 训练7 小结前言 核心内容来自博客链接1博客连接2希望大家多…

Java设计模式七大原则-里氏替换原则

里氏替换原则 OO中的继承性的思考和说明 继承包含这样一层含义&#xff1a;父类中凡是已经实现好的方法&#xff0c;实际上是在设定规范和契约&#xff0c;虽然它不强制要求所有的子类必须遵循这些契约&#xff0c;但是如果子类对这些已经实现的方法任意修改&#xff0c;就会对…

C++利器STL——vector详解

要努力&#xff0c;但不要着急&#xff0c;繁花锦簇&#xff0c;硕果累累都需要过程&#xff01; 目录 1.vector的介绍及使用 1.1vector的介绍 1.2vector的使用 2.vector模拟实现 3.vector常见试题 1.vector的介绍及使用 1.1vector的介绍 1. vector是表示可变大小数组的序列容…

深度学习入门(9)神经网络Affine与Softmax层的计算图表示方式及其误差反向传播的代码实现

《深度学习入门》系列文章目录 深度学习入门 (1)感知机 深度学习入门&#xff08;2&#xff09;神经网络 深度学习入门&#xff08;3&#xff09;神经网络参数梯度的计算方式 深度学习入门&#xff08;4&#xff09;【深度学习实战】无框架实现两层神经网络的搭建与训练过程 深…

【信管2.3】项目生命周期

项目生命周期上一篇文章内容有点多呀&#xff0c;消化完了吗&#xff1f;其实吧&#xff0c;最主要的就是那三种组织形式而已&#xff0c;别的真没什么&#xff0c;记住它们的优缺点和项目经理的权力大小就可以了。今天我们轻松点&#xff0c;虽说还是挺重要的&#xff0c;但要…

java中类加载与双亲委派机制

类加载是什么 把磁盘中的java文件加载到内存中的过程叫做类加载 当我们用java命令运行某个类的main函数启动程序时&#xff0c;首先需要通过类加载器把主类加载到JVM. 有如下 User 类 package dc.dccmmtop; public Class User {public static void main(String[] args) {Sys…

TextBox文本框与PasswordBox密码框水印

在开发一个软件和网页的时候&#xff0c;都会有一个功能&#xff0c;那就是登陆功能&#xff0c;有了登陆那就一定需要用户输入账号和密码&#xff0c;我们在写登陆页面都会想到使用TextBox和PasswordBox去完成这两个功能&#xff0c;但是有一个问题&#xff0c;那就是如果你使…

pycharm opencv无法自动补全

我的环境 python 3.6.9opencv-python 4.4.0.42opencv-contrib-python 4.6.66ubuntu 18.04 LTSpycharm 2020.3.2 解决方案 首先找到cv2的site-packagespip3 show opencv-python进入到该目录, 复制so结尾文件至上级目录: cp cv2.cpython-36m-x86_64-linux-gnu.so ../等待pych…

R语言用ARIMA模型滑动时间窗口识别网络流量时间序列异常值

全文链接&#xff1a;http://tecdat.cn/?p30597最近我们被要求解决时间序列异常检验的问题。有客户在使用大量的时间序列。这些时间序列基本上是每10分钟进行一次的网络测量&#xff0c;其中一些是周期性的&#xff08;即带宽&#xff09;&#xff0c;而另一些则不是&#xff…

微信开发者工具C盘占用大的问题

将User Data 下的文件迁移到其他盘&#xff0c;比如 D盘&#xff0c;E盘&#xff0c;F盘 步骤如下&#xff1a; 1.找到微信开发者工具C盘所在的缓存目录&#xff0c;一般为 C:\Users\ 你的用户名\AppData\Local\微信开发者工具\User Data 将里面的内容全部剪切到其它盘符&…

使用Psycopg2连接openGauss

文章目录1.简介2.接口介绍开发流程接口说明3.使用3.1环境准备3.2下载并加载python驱动3.3创建数据库连接用户3.4示例4.常见报错1.简介 Psycopg是一种用于执行SQL语句的PythonAPI&#xff0c;可以为PostgreSQL、openGauss数据库提供统一访问接口&#xff0c;应用程序可基于它进…

嘉创房地产冲刺港交所:半年营收4.7亿 现金及现金等价物减少

雷递网 雷建平 11月28日嘉创房地产控股有限公司&#xff08;简称&#xff1a;“嘉创”&#xff09;日前递交招股书&#xff0c;准备在港交所上市。半年营收4.73亿嘉创为一家精品住宅物业发展商&#xff0c;主要在大湾区的东莞、惠州及佛山迅速发展的住宅市场&#xff08;如东莞…

干货 | 数字经济创新创业——如何发展绿色经济

下文整理自清华大学大数据能力提升项目能力提升模块课程“Innovation & Entrepreneurship for Digital Economy”&#xff08;数字经济创新创业课程)的精彩内容。主讲嘉宾&#xff1a;Kris Singh: CEO at SRII, Palo Alto, CaliforniaVisiting Professor of Tsinghua Unive…

下沉市场投资热度提升 7天酒店打造酒店投资“极致性价比”

近日&#xff0c;7天酒店 “总裁面对面”酒店投资云沙龙活动举办&#xff0c;通过微信、抖音双平台联合直播&#xff0c;多维度探讨酒店行业的“新蓝海”机遇以及下沉市场的投资模式&#xff0c;助力更多投资人把握新的市场红利。 经济型酒店拥抱“新蓝海” 下沉市场投资热度提…

Antd中Table列表行默认包含修改及删除功能的封装

一、前言 ant-design是非常不错、方便的一款前端组件库&#xff0c;而这次用到的ProComponents则是在 Ant Design 上进行了自己的封装&#xff0c;更加易用&#xff0c;与 Ant Design 设计体系一脉相承&#xff0c;无缝对接 antd 项目&#xff0c;样式风格与 antd 一脉相承&am…

SAP 财务月结之 外币评估(TCODE:FAGL_FC_VAL,S4版本用 FAGL_FCV)<转载>

原文链接&#xff1a;https://zhuanlan.zhihu.com/p/367876296 在会计期末&#xff0c;企业往往会有以外币记的余额&#xff0c;如应付账款&#xff08;国外&#xff09;、应收账款&#xff08;国外&#xff09;&#xff0c;或外币存款。而企业出具的财务报表&#xff0c;货币必…

学习笔记11月27日

Infant Brain Deformable Registration Using Global and Local Label-Driven Deep Regression Learning 文章来源&#xff1a;谷歌学术 一、摘要 婴儿大脑磁共振&#xff08;MR&#xff09;图像的可变形配准具有挑战性&#xff0c;因为&#xff1a;(1)这些纵向图像存在较大的…

RK3588平台开发系列讲解(USB篇)USB 外设 CONFIG

平台内核版本安卓版本RK3588Linux 5.10Android 12文章目录 一、 Mass Storage Class CONFIG二、USB Serial Converter CONFIG三、USB HID CONFIG四、USB Net CONFIG五、USB Camera CONFIG六、USB Audio CONFIG七、 USB HUB CONFIG沉淀、分享、成长,让自己和他人都能有所收获!…

Java并发-多线程售票案例

1. 前言 本节内容主要是使用 Java 的使用 Condition 和 Lock 机制对多线程售票案例进行实现。售票案例多数情况下主要关注多线程如何安全的减少库存&#xff0c;也就是剩余的票数&#xff0c;当票数为 0 时&#xff0c;停止减少库存。 2. 售票机制模型 如下图所示&#xff0…

ANR系列之ContentProvider类型原理讲解

前言&#xff1a; 众所周知&#xff0c;ANR一共有四种类型&#xff0c;如下&#xff1a; 1.输入事件类型ANR 2.广播类型ANR 3.ContentProvider类型ANR 4.Service类型ANR 四种类型的超时时间如下所示&#xff1a; 所以ANR系列文章也会分为5篇文章来进行讲解&#xff0c;本…