對(duì)于一些離線預(yù)測任務(wù),或者D+1天的預(yù)測任務(wù),可以簡單地采用Crontab做定時(shí)調(diào)用項(xiàng)目代碼運(yùn)行項(xiàng)目
Crontab簡介:
Linux crontab命令常見于Unix和類Unix的操作系統(tǒng)之中,用于設(shè)置周期性被執(zhí)行的指令。該命令從標(biāo)準(zhǔn)輸入設(shè)備讀取指令,并將其存放于“crontab”文件中,以供之后讀取和執(zhí)行。通過 crontab 命令,用戶可以添加、修改、刪除和列出定時(shí)任務(wù),以實(shí)現(xiàn)自動(dòng)化執(zhí)行特定任務(wù)。
Crontab下載
sudo apt-get install cron
Docker鏡像
我們新建一個(gè)名為cron-test
的容器,使用下面這個(gè)py代碼作為測試
import numpy as np
if __name__ == '__main__':
x = np.empty([2,4])
print(x)
容器運(yùn)行結(jié)果如下:
使用shell腳本運(yùn)行容器
在當(dāng)前目錄下,終端執(zhí)行命令進(jìn)入shell腳本編輯
- 新建一個(gè)名為
cron-test
的shell腳本
touch cron-test.sh
- 終端運(yùn)行
vim cron-test.sh
編輯腳本,i進(jìn)入編輯,Esc退出編輯,shift+:wq!保存并退出
注:#!/bin/bash
明確指定腳本使用 Bash 解釋器執(zhí)行,而#!/bin/sh
使用系統(tǒng)默認(rèn)的Shell(可能是Bash或其他兼容的Shell)執(zhí)行。如果腳本依賴于特定的Bash功能,或者想確保在不同的系統(tǒng)上都使用Bash作為解釋器,那么使用#!/bin/bash
是一個(gè)更安全的選擇。
在這里我的shell腳本如下:
- 終端運(yùn)行命令執(zhí)行shell腳本
/home/licy/文檔/cron-test.sh
使用crontab設(shè)置定時(shí)任務(wù)運(yùn)行shell腳本
打開crontab編輯器
crontab -e
編寫定時(shí)任務(wù)命令
基本格式:分鐘 小時(shí) 一月的第幾天 月份 周幾 用戶名 要執(zhí)行的命令
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
例如我們想每分鐘運(yùn)行一次shell腳本,寫法如下
* * * * * /home/licy/文檔/cron-test.sh
然后保存crontab并退出
按下Ctrl + O保存更改,然后按下Enter確認(rèn)
按下Ctrl + X退出編輯器。
我們就可以在日志文件里找到腳本的運(yùn)行結(jié)果了
我們還可以在/var/log/cron*
中找到運(yùn)行日志:
定時(shí)任務(wù)常見于日?qǐng)?bào)周報(bào)月報(bào),這里也給一下寫法
# 每天早上8點(diǎn)運(yùn)行
0 8 * * * [command]
# 每周一早上8點(diǎn)運(yùn)行
0 8 * * 1 [command]
# 每個(gè)月第一天的早上8點(diǎn)運(yùn)行
0 8 1 * * [command]
Crontab執(zhí)行時(shí)間計(jì)算 - 在線工具
在上述Crontab定時(shí)任務(wù)下,因?yàn)槲覀冞\(yùn)行的是腳本文件,因此若代碼中有有報(bào)錯(cuò)的話將不會(huì)發(fā)送輸出文件,但會(huì)將報(bào)錯(cuò)信息發(fā)送郵件,默認(rèn)郵件的路徑為 /var/mail
,可以通過郵件了解報(bào)錯(cuò)原因。
如果直接在Crontab里執(zhí)行Docker任務(wù)(不經(jīng)過shell腳本),則每一次執(zhí)行任務(wù)后都將輸出發(fā)送郵件??梢孕薷拿畈话l(fā)送郵件避免占用空間:
* * * * * /yourpath/yourcommand > /dev/null
Crontab其他常用命令
- Crontab 啟動(dòng)、停止、重啟命令
# 啟動(dòng)服務(wù)
service crond start
# 關(guān)閉服務(wù)
service crond stop
# 重啟服務(wù)
service crond restart
# 重新載入配置
service crond reload
# 查看crontab服務(wù)狀態(tài)
service crond status
# 同樣可以設(shè)置開機(jī)自啟動(dòng)
chkconfig --level 345 crond on
- 查看、添加、刪除任務(wù)
# 查看crontab定時(shí)任務(wù)
crontab -l
# 添加任務(wù),cron表達(dá)式 sh腳本路徑
crontab -e
# 刪除所有的定時(shí)任務(wù)
crontab -r
常見報(bào)錯(cuò):
1. Permission denied while trying to connect to the Docker daemon socket at unix
原因:docker進(jìn)程使用 Unix Socket 而不是 TCP 端口。而默認(rèn)情況下,Unix socket 屬于 root 用戶,因此需要 root權(quán)限 才能訪問
解決:為了避免每次運(yùn)行Docker命令的時(shí)候都需要輸入sudo,可以創(chuàng)建一個(gè)docker用戶組,并把相應(yīng)的用戶添加到docker分組里面。當(dāng)docker進(jìn)程啟動(dòng)的時(shí)候,會(huì)設(shè)置套接字可以被docker分組的用戶讀寫。
查看docker組中的用戶
cat /etc/group | grep docker
在這里可以看到,我們的Docker用戶組(GID為998)當(dāng)前沒有任何用戶,因此我們需要將用戶加入Docker組
sudo gpasswd -a ${USER} docker # 例如我的USER是licy
更新當(dāng)前Docker用戶組
newgrp docker
重新運(yùn)行命令查看docker組中的用戶,這時(shí)就可以看到我已經(jīng)被加入到docker用戶組中
2. 找不到執(zhí)行任務(wù)的郵件
原因:系統(tǒng)中沒有安裝郵件傳輸代理(MTA),因此cron任務(wù)的輸出被丟棄了。
解決:終端運(yùn)行以下命令安裝Postfix:
sudo apt update
sudo apt install postfix
3. 頻繁發(fā)送執(zhí)行郵件占用空間
# 修改執(zhí)行命令為:
* * * * * /yourpath/yourcommand > /dev/null
4. 找不到crontab日志
解決:需要通過配置打開crontab的日志記錄功能文章來源:http://www.zghlxwxcb.cn/news/detail-676951.html
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文章來源地址http://www.zghlxwxcb.cn/news/detail-676951.html
到了這里,關(guān)于Crontab定時(shí)任務(wù)運(yùn)行Docker容器(Ubuntu 20)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!