Crontab定时任务运行Docker容器(Ubuntu 20)

对于一些离线预测任务,或者D+1天的预测任务,可以简单地采用Crontab做定时调用项目代码运行项目

Crontab简介:

Linux crontab命令常见于Unix和类Unix的操作系统之中,用于设置周期性被执行的指令。该命令从标准输入设备读取指令,并将其存放于"crontab"文件中,以供之后读取和执行。通过 crontab 命令,用户可以添加、修改、删除和列出定时任务,以实现自动化执行特定任务。

Crontab下载

shell 复制代码
sudo apt-get install cron

Docker镜像

我们新建一个名为cron-test的容器,使用下面这个py代码作为测试

python 复制代码
import numpy as np

if __name__ == '__main__':
    x = np.empty([2,4])
    print(x)

容器运行结果如下:

使用shell脚本运行容器

在当前目录下,终端执行命令进入shell脚本编辑

  1. 新建一个名为cron-test的shell脚本
shell 复制代码
touch cron-test.sh
  1. 终端运行 vim cron-test.sh 编辑脚本,i进入编辑,Esc退出编辑,shift+:wq!保存并退出
    注:#!/bin/bash 明确指定脚本使用 Bash 解释器执行,而 #!/bin/sh 使用系统默认的Shell(可能是Bash或其他兼容的Shell)执行。如果脚本依赖于特定的Bash功能,或者想确保在不同的系统上都使用Bash作为解释器,那么使用 #!/bin/bash 是一个更安全的选择。

在这里我的shell脚本如下:

  1. 终端运行命令执行shell脚本
shell 复制代码
/home/licy/文档/cron-test.sh

使用crontab设置定时任务运行shell脚本

打开crontab编辑器

shell 复制代码
crontab -e

编写定时任务命令

基本格式:分钟 小时 一月的第几天 月份 周几 用户名 要执行的命令

powershell 复制代码
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

例如我们想每分钟运行一次shell脚本,写法如下

powershell 复制代码
* * * * * /home/licy/文档/cron-test.sh

然后保存crontab并退出

powershell 复制代码
按下Ctrl + O保存更改,然后按下Enter确认
按下Ctrl + X退出编辑器。

我们就可以在日志文件里找到脚本的运行情况了

定时任务常见于日报周报月报,这里也给一下写法

powershell 复制代码
# 每天早上8点运行
0 8 * * *  [command]

# 每周一早上8点运行
0 8 * * 1  [command]

# 每个月第一天的早上8点运行
0 8 1 * *  [command]

Crontab执行时间计算 - 在线工具

在上述Crontab定时任务下,有报错将不会发送日志,但会将报错信息发送邮件,默认邮件的路径为 /var/mail,可以通过邮件了解报错原因。如果直接在Crontab里执行Docker任务(不经过shell脚本),则每一次执行任务后都将发送邮件。可以修改命令不发送邮件避免占用空间:

powershell 复制代码
* * * * * /yourpath/yourcommand > /dev/null

Crontab其他常用命令

  1. Crontab 启动、停止、重启命令
shell 复制代码
#  启动服务
service crond start
# 关闭服务
service crond stop 
# 重启服务
service crond restart
# 重新载入配置
service crond reload
# 查看crontab服务状态
service crond status
# 同样可以设置开机自启动
chkconfig --level 345 crond on
  1. 查看、添加、删除任务
shell 复制代码
# 查看crontab定时任务
crontab -l
# 添加任务,cron表达式  sh脚本路径
crontab -e
# 删除所有的定时任务
crontab -r

常见报错:
1. Permission denied while trying to connect to the Docker daemon socket at unix

原因:docker进程使用 Unix Socket 而不是 TCP 端口。而默认情况下,Unix socket 属于 root 用户,因此需要 root权限 才能访问

解决:为了避免每次运行Docker命令的时候都需要输入sudo,可以创建一个docker用户组,并把相应的用户添加到docker分组里面。当docker进程启动的时候,会设置套接字可以被docker分组的用户读写。

查看docker组中的用户

python 复制代码
cat /etc/group | grep docker

在这里可以看到,我们的Docker用户组(GID为998)当前没有任何用户,因此我们需要将用户加入Docker组

shell 复制代码
sudo gpasswd -a ${USER} docker  # 例如我的USER是licy

更新当前Docker用户组

powershell 复制代码
newgrp docker

重新运行命令查看docker组中的用户,这时就可以看到我已经被加入到docker用户组中

2. 找不到执行任务的邮件

原因:系统中没有安装邮件传输代理(MTA),因此cron任务的输出被丢弃了。

解决:

第一种:终端运行以下命令安装Postfix:

shell 复制代码
sudo apt update
sudo apt install postfix

第二种:需要通过配置打开crontab的日志记录功能

shell 复制代码
sudo vim /etc/rsyslog.d/50-default.conf
cron.* /var/log/cron.log # 将cron前面的注释去掉
# 重启rsyslog
sudo /etc/init.d/rsyslog restart
# 重启rsyslog
sudo service rsyslog restart 
# 重启cron程度
sudo service cron restart

参考来源:
解决 ERROR:Docker Got permission denied while trying to connect to the Docker daemon socket at unix

相关推荐
帷幕落秋9 分钟前
Linux 网络基础
linux
高晶17 分钟前
ARM 嵌入式 Linux 命令系统 BusyBox 实战指南
linux·设计模式·程序员
Initialize2930825 分钟前
Docker 容器网络不通?五步排查法
运维
重生之高冷汉堡包1 小时前
家庭住宅IP是什么?机房住宅与普通住宅有什么区别
运维·服务器·网络·网络协议·tcp/ip·用户运营
Thneonl1 小时前
git reset --hard 之后先别哭:reflog 里存着你刚弄丢的那个分支
运维·后端
见闻小天地1 小时前
液冷直流负载:AI 算力中心带载测试的关键设备
运维·业界资讯
迪康软件zz1 小时前
从 PHP 高危漏洞看纵深防御:资产盘点、补丁管理与端点防护实践
运维·安全·自动化运维
祥Sir的SRE笔记1 小时前
CPU 100% 不一定是故障:压测打满、业务饱和、突变打满的判断与排查
linux·面试·性能优化·dba·sre·故障定位·性能排查
智能运维指南1 小时前
2026 年可观测平台选型对比:混合 IT 架构下企业运维监控产品怎么选
运维·可观测·嘉为蓝鲸·运维监控产品对比
Fnetlink11 小时前
Fnet 云网安 261023
运维·开发语言·网络·人工智能·安全·web安全·php