对于一些离线预测任务,或者D+1天的预测任务,可以简单地采用Crontab做定时调用项目代码运行项目
Crontab简介:
Linux crontab命令常见于Unix和类Unix的操作系统之中,用于设置周期性被执行的指令。该命令从标准输入设备读取指令,并将其存放于“crontab”文件中,以供之后读取和执行。通过 crontab 命令,用户可以添加、修改、删除和列出定时任务,以实现自动化执行特定任务。
Crontab下载
sudo apt-get install cron
Docker镜像
我们新建一个名为cron-test
的容器,使用下面这个py代码作为测试
import numpy as np
if __name__ == '__main__':
x = np.empty([2,4])
print(x)
容器运行结果如下:
使用shell脚本运行容器
在当前目录下,终端执行命令进入shell脚本编辑
- 新建一个名为
cron-test
的shell脚本
touch cron-test.sh
- 终端运行
vim cron-test.sh
编辑脚本,i进入编辑,Esc退出编辑,shift+:wq!保存并退出
注:#!/bin/bash
明确指定脚本使用 Bash 解释器执行,而#!/bin/sh
使用系统默认的Shell(可能是Bash或其他兼容的Shell)执行。如果脚本依赖于特定的Bash功能,或者想确保在不同的系统上都使用Bash作为解释器,那么使用#!/bin/bash
是一个更安全的选择。
在这里我的shell脚本如下:
- 终端运行命令执行shell脚本
/home/licy/文档/cron-test.sh
使用crontab设置定时任务运行shell脚本
打开crontab编辑器
crontab -e
编写定时任务命令
基本格式:分钟 小时 一月的第几天 月份 周几 用户名 要执行的命令
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脚本,写法如下
* * * * * /home/licy/文档/cron-test.sh
然后保存crontab并退出
按下Ctrl + O保存更改,然后按下Enter确认
按下Ctrl + X退出编辑器。
我们就可以在日志文件里找到脚本的运行情况了
定时任务常见于日报周报月报,这里也给一下写法
# 每天早上8点运行
0 8 * * * [command]
# 每周一早上8点运行
0 8 * * 1 [command]
# 每个月第一天的早上8点运行
0 8 1 * * [command]
Crontab执行时间计算 - 在线工具
在上述Crontab定时任务下,有报错将不会发送日志,但会将报错信息发送邮件,默认邮件的路径为 /var/mail
,可以通过邮件了解报错原因。如果直接在Crontab里执行Docker任务(不经过shell脚本),则每一次执行任务后都将发送邮件。可以修改命令不发送邮件避免占用空间:
* * * * * /yourpath/yourcommand > /dev/null
Crontab其他常用命令
- Crontab 启动、停止、重启命令
# 启动服务
service crond start
# 关闭服务
service crond stop
# 重启服务
service crond restart
# 重新载入配置
service crond reload
# 查看crontab服务状态
service crond status
# 同样可以设置开机自启动
chkconfig --level 345 crond on
- 查看、添加、删除任务
# 查看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组中的用户
cat /etc/group | grep docker
在这里可以看到,我们的Docker用户组(GID为998)当前没有任何用户,因此我们需要将用户加入Docker组
sudo gpasswd -a ${USER} docker # 例如我的USER是licy
更新当前Docker用户组
newgrp docker
重新运行命令查看docker组中的用户,这时就可以看到我已经被加入到docker用户组中
2. 找不到执行任务的邮件
原因:系统中没有安装邮件传输代理(MTA),因此cron任务的输出被丢弃了。
解决:
第一种:终端运行以下命令安装Postfix:
sudo apt update
sudo apt install postfix
第二种:需要通过配置打开crontab的日志记录功能
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