哈嘍大家好,我是咸魚。
說到 Linux 定時(shí)任務(wù),大家用得最多的就是 crond 服務(wù),但其實(shí) systemd 也有類似的功能。我們不但可以通過 systemd 來管理服務(wù),還能設(shè)置定時(shí)任務(wù),那就是 systemd timer。
與 crond 相比,systemd 定時(shí)任務(wù)具有以下優(yōu)點(diǎn):
- 更高的精度:systemd 定時(shí)任務(wù)可以精確到秒,而 crond 只能精確到分鐘。
- 可以限制資源使用:使用 systemd 定時(shí)任務(wù)可以設(shè)置內(nèi)存和 CPU 的使用限制,比如最多使用 50% 的 CPU。
- 更靈活的配置:systemd 定時(shí)任務(wù)可以通過條件、依賴關(guān)系等進(jìn)行配置,以控制任務(wù)的執(zhí)行。相比之下,crond 的配置相對(duì)簡(jiǎn)單,靈活性較低。
舉個(gè)例子,假設(shè)我們要通過 crond 配置多個(gè)大文件的遠(yuǎn)程備份(使用 scp、rsync 或 ftp 的方式),但由于大文件的網(wǎng)絡(luò)傳輸時(shí)間不確定,因此下一個(gè)文件的備份任務(wù)開始時(shí)間幾乎都是按照經(jīng)驗(yàn)估計(jì)的。
這可能導(dǎo)致上一個(gè)任務(wù)的網(wǎng)絡(luò)傳輸尚未完成,下一個(gè)任務(wù)已經(jīng)開始,同時(shí)占用網(wǎng)絡(luò)帶寬,然后又啟動(dòng)了下一個(gè)任務(wù),形成惡性循環(huán)。
而使用 systemd timer 可以建立任務(wù)之間的依賴關(guān)系,例如在第一個(gè)備份任務(wù)完成后再啟動(dòng)第二個(gè)備份任務(wù),以此類推。
systemd timer 原理
systemd 定時(shí)任務(wù)基于 systemd 的單元管理器。它使用兩種類型的單元來管理定時(shí)任務(wù):.timer
單元和 .service
單元。
-
.timer
單元:-
.timer
單元定義了定時(shí)規(guī)則,包括啟動(dòng)時(shí)間、間隔時(shí)間等。 - 每個(gè)
.timer
單元都對(duì)應(yīng)一個(gè)或多個(gè)關(guān)聯(lián)的.service
單元。
-
-
.service
單元:-
.service
單元定義了要在計(jì)時(shí)器觸發(fā)時(shí)運(yùn)行的服務(wù)或命令。 - 當(dāng)
.timer
觸發(fā)時(shí),相關(guān)聯(lián)的.service
單元將被啟動(dòng)。
-
systemd 定時(shí)任務(wù)原理是:systemd 定期檢查每個(gè) .timer
單元中定義的定時(shí)規(guī)則,以確定是否觸發(fā)相應(yīng)的定時(shí)器。一旦定時(shí)器觸發(fā),systemd 將啟動(dòng)與該定時(shí)器關(guān)聯(lián)的 .service
單元,從而執(zhí)行預(yù)定的任務(wù)。
在正式介紹 systemd 定時(shí)任務(wù)之前,我們先要了解什么是單元(unit)。
systemd 單元
簡(jiǎn)單來講,單元就是 systemd 的最小管理單位,是單個(gè)進(jìn)程的描述。一個(gè)個(gè)單元相互調(diào)用和依賴,組成一個(gè)龐大的任務(wù)管理系統(tǒng)。
systemd 中的 unit 有很多類型,下面是一些常見的 unit 類型:
-
.service
:service 單元,也就是我們常說的系統(tǒng)服務(wù) -
.target
:target 單元,其實(shí)就是一堆 unit 的集合,比如常見的multi-user.target
-
.timer
:timer 單元,負(fù)責(zé)定時(shí)任務(wù)。 -
.slice
:slice 單元,負(fù)責(zé)資源的分配。
每個(gè) unit 都有一個(gè)描述文件(unit 負(fù)責(zé)干什么、怎么干...),它們分散在三個(gè)目錄:
-
/lib/systemd/system
:系統(tǒng)默認(rèn)的 unit 文件 -
/etc/systemd/system
:包含用戶自定義的 unit 文件,如果設(shè)置了開機(jī)自啟動(dòng),則該目錄下的 unit 描述文件會(huì)創(chuàng)建一個(gè)符號(hào)鏈接。 -
/usr/lib/systemd/system
:用戶自己定義的 unit 文件,也會(huì)包含一些系統(tǒng)默認(rèn)的 unit 文件
大多數(shù) linux 發(fā)行版中
/lib
是/usr/lib
的軟鏈接,所以 1 和 3 其實(shí)是同一目錄,作用自然應(yīng)該是相同的。
其實(shí)可以簡(jiǎn)單分成兩類:
-
/etc/systemd/system
:用戶自定義的 unit 文件 -
/usr/lib/systemd/system
:系統(tǒng)默認(rèn)的 unit 文件和用戶安裝軟件的 unit 文件
# 查看所有 unit
$ systemctl list-unit-files
# 查看所有 Service unit
$ systemctl list-unit-files --type service
# 查看所有 Timer unit
$ systemctl list-unit-files --type timer
關(guān)于 systemd unit 相關(guān)的內(nèi)容這里就不細(xì)講了,大家可以看我之前的文章:《systemctl 命令設(shè)置開機(jī)自啟動(dòng)失敗 》
設(shè)置 systemd 定時(shí)任務(wù)
有一個(gè)檢查 https 證書是否過期的腳本 check_https.sh
,我們現(xiàn)在需要系統(tǒng)定期執(zhí)行這個(gè)腳本,除此之外,系統(tǒng)在開機(jī)之后也會(huì)執(zhí)行這個(gè)腳本。
首先創(chuàng)建一個(gè) service unit
[root@localhost ~]# cat /usr/lib/systemd/system/check-https.service
[Unit]
Description=check https certificates
[Service]
Type=oneshot
ExecStart=check_https.sh
[Install]
WantedBy=multi-user.target
Type=oneshot
表示 service 以一次性(Oneshot)方式運(yùn)行。這意味著當(dāng)啟動(dòng) service 時(shí),它將執(zhí)行一次,并在完成后退出。
然后我們創(chuàng)建一個(gè) timer unit
Service unit 只是定義了如何執(zhí)行任務(wù),要定時(shí)執(zhí)行這個(gè) Service,還必須定義 Timer unit
[root@localhost ~]# cat /usr/lib/systemd/system/check-https.timer
[Unit]
Description=Runs check https every day
[Timer]
OnUnitActiveSec=24h
Unit=check-https.service
[Install]
WantedBy=multi-user.target
我們著重來看下 [Timer] 部分:
-
OnActiveSec
:定時(shí)任務(wù)生效后,多少時(shí)間開始執(zhí)行任務(wù) -
OnBootSec
:系統(tǒng)啟動(dòng)后,多少時(shí)間開始執(zhí)行任務(wù) -
OnStartupSec
:Systemd 進(jìn)程啟動(dòng)后,多少時(shí)間開始執(zhí)行任務(wù) -
OnUnitActiveSec
:該 unit 上次執(zhí)行后,等多少時(shí)間再次執(zhí)行 -
OnUnitInactiveSec
: 定時(shí)任務(wù)上次關(guān)閉后多少時(shí)間,再次執(zhí)行 -
OnCalendar
:基于絕對(duì)時(shí)間,而不是相對(duì)時(shí)間執(zhí)行 -
AccuracySec
:如果因?yàn)楦鞣N原因,任務(wù)必須推遲執(zhí)行,推遲的最大秒數(shù),默認(rèn)是60秒 -
Unit
:真正要執(zhí)行的任務(wù),默認(rèn)是同名的帶有.service
后綴的 unit -
Persistent
:如果設(shè)置了該字段,即使定時(shí)任務(wù)到時(shí)沒有啟動(dòng),也會(huì)自動(dòng)執(zhí)行相應(yīng)的 unit -
WakeSystem
:如果系統(tǒng)休眠,是否自動(dòng)喚醒系統(tǒng)
上面的 timer 文件里,OnUnitActiveSec=24h
表示 24 小時(shí)執(zhí)行一次任務(wù)。
下面是其他的寫法:
1、在系統(tǒng)啟動(dòng) 15 分鐘后執(zhí)行,并在系統(tǒng)運(yùn)行時(shí),每周執(zhí)行一次
[Timer]
OnBootSec=15min
OnUnitActiveSec=1w
Unit=check-https.service
2、每周周一執(zhí)行,如果到時(shí)定時(shí)任務(wù)沒有啟動(dòng),會(huì)立即執(zhí)行
[Timer]
OnCalendar=weekly
Persistent=true
Unit=check-https.service
3、每周日凌晨三點(diǎn)執(zhí)行(時(shí)間格式:Year-Month-Day Hour:Minute:Second
)
[Timer]
OnCalendar=Sun *-*-* 03:00:00
Unit=check-https.service
官方文檔:https://www.freedesktop.org/software/systemd/man/latest/systemd.time.html
然后我們啟動(dòng)這個(gè)定時(shí)任務(wù),并設(shè)置開機(jī)自啟動(dòng)文章來源:http://www.zghlxwxcb.cn/news/detail-852479.html
# 重新加載配置
systemctl daemon-reload
systemctl start check-https.timer
systemctl enable check-https.timer
其他一些定時(shí)任務(wù)命令:文章來源地址http://www.zghlxwxcb.cn/news/detail-852479.html
# 查看所有正在運(yùn)行的定時(shí)任務(wù)
systemctl list-timers
# 關(guān)閉定時(shí)任務(wù)
systemctl stop check-https.timer
# 查看定時(shí)任務(wù)狀態(tài)
systemctl status check-https.timer
到了這里,關(guān)于Linux systemd 定時(shí)任務(wù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!