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

相关推荐
JhonKI2 分钟前
【Linux网络】深入解析I/O多路转接 - Select
linux·运维·网络
伤不起bb2 分钟前
Nginx 核心功能
linux·服务器·nginx
The-Dog40 分钟前
Linux命令使用记录(自用)
linux
识途老码1 小时前
什么是单臂路由
运维·服务器·网络·单臂路由
Linux运维老纪1 小时前
Ansible 铸就 Linux 安全之盾(Ansible Builds Linux Security Shield)
linux·服务器·网络·安全·云计算·ansible·运维开发
唐青枫2 小时前
Linux apropos 命令使用详解
linux
刘大猫.2 小时前
Centos Ubuntu RedOS系统类型下查看系统信息
linux·ubuntu·centos·ip·ifconfig·redos·查询系统信息
YuSun_WK3 小时前
程序&进程&多任务&线程
linux·运维·服务器
HeLLo_a1194 小时前
第11章 安全网络架构和组件(一)
linux·服务器·网络
南川琼语4 小时前
TCP概念+模拟tcp服务器及客户端
linux·服务器·网络·tcp/ip