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

相关推荐
码农101号4 分钟前
Linux中shell编程表达式和数组讲解
linux·运维·服务器
powerfulzyh17 分钟前
非Root用户启动SSH服务经验小结
运维·ssh
云道轩25 分钟前
升级centos 7.9内核到 5.4.x
linux·运维·centos
是小满满满满吗28 分钟前
传输层:udp与tcp协议
linux·服务器·网络
爱学习的小道长39 分钟前
Ubuntu Cursor升级成v1.0
linux·运维·ubuntu
EelBarb1 小时前
seafile:ubuntu搭建社区版seafile12.0
linux·运维·ubuntu
Xam_d_LM1 小时前
【Latex】Windows/Ubuntu 绘制 eps 矢量图通用方法(drawio),支持插入 Latex 数学公式
linux·ubuntu·科研·矢量图·drawio
402 Payment Required1 小时前
serv00 ssh登录保活脚本-邮件通知版
运维·chrome·ssh
小柏ぁ1 小时前
calico/node is not ready: BIRD is not ready: BGP not established with xxx
运维·docker·kubernetes
Mintimate1 小时前
云服务器 Linux 手动 DD 安装第三方 Linux 发行版:原理与实战
linux·运维·服务器