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

相关推荐
vickycheung313 分钟前
基于RK3588的移动充电机器人应用解决方案
linux·机器人·arm 嵌入式开发
胡西风_foxww1 小时前
Linux下编译安装Nginx
linux·运维·nginx·编译·安装·openssl·pcre
阿伟*rui2 小时前
docker入门
运维·docker·容器
风兮雨露3 小时前
Linux(CentOS 7) yum一键安装mysql8
linux·服务器·mysql
算力魔方AIPC4 小时前
在Ubuntu 24.04 LTS上安装飞桨PaddleX
linux·ubuntu·paddlepaddle
山___4 小时前
Centos 9 安装 PostgreSQL 16 并支持远程访问
linux·运维·centos
weixin_438197384 小时前
k8s服务内容滚动升级以及常用命令介绍
linux·运维·docker·云原生·容器·kubernetes
祭の4 小时前
什是服务器器和Apache Tomcat介绍(笔记)
运维·服务器·笔记
Linux运维技术栈4 小时前
企业生产环境-麒麟V10(ARM架构)操作系统部署Zookeeper单节点&集群版
linux·运维·zookeeper·架构·arm