新聞中心
systemd 提供定時(shí)器有一段時(shí)間了,定時(shí)器替代了 cron 功能,這一特性值得看看。本文將向你介紹在系統(tǒng)啟動(dòng)后如何使用 systemd 中的定時(shí)器來(lái)運(yùn)行任務(wù),并在此后重復(fù)運(yùn)行。這不是對(duì) systemd 的全面討論,只是對(duì)此特性的一個(gè)介紹。

創(chuàng)新互聯(lián)建站是一家專業(yè)提供海城企業(yè)網(wǎng)站建設(shè),專注與成都做網(wǎng)站、網(wǎng)站設(shè)計(jì)、外貿(mào)營(yíng)銷網(wǎng)站建設(shè)、H5場(chǎng)景定制、小程序制作等業(yè)務(wù)。10年已為海城眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站制作公司優(yōu)惠進(jìn)行中。
快速回顧:cron、anacron 與 systemd
cron 可以以幾分鐘到幾個(gè)月或更長(zhǎng)時(shí)間的粒度調(diào)度運(yùn)行一個(gè)任務(wù)。設(shè)置起來(lái)相對(duì)簡(jiǎn)單,它只需要一個(gè)配置文件。雖然配置過(guò)程有些深?yuàn)W,但一般用戶也可以使用。
然而,如果你的系統(tǒng)在需要執(zhí)行的時(shí)間沒(méi)有運(yùn)行,那么 cron 會(huì)失敗。
anacron 克服了“系統(tǒng)沒(méi)有運(yùn)行”的問(wèn)題。它確保任務(wù)將在你的系統(tǒng)再次啟動(dòng)時(shí)執(zhí)行。雖然它旨在給管理員使用,但有些系統(tǒng)允許普通用戶訪問(wèn) anacron。
但是,anacron 的執(zhí)行頻率不能低于每天一次。
cron 和 anacron 都存在執(zhí)行上下文一致性的問(wèn)題。必須注意任務(wù)運(yùn)行時(shí)有效的環(huán)境與測(cè)試時(shí)使用的環(huán)境完全相同。必須提供相同的 shell、環(huán)境變量和路徑。這意味著測(cè)試和調(diào)試有時(shí)會(huì)很困難。
systemd 定時(shí)器提供了 cron 和 anacron 二者的優(yōu)點(diǎn),允許調(diào)度到分鐘粒度。確保在系統(tǒng)再次運(yùn)行時(shí)執(zhí)行任務(wù),即使在預(yù)期的執(zhí)行時(shí)間內(nèi)系統(tǒng)處于關(guān)閉狀態(tài)。它對(duì)所有用戶都可用。你可以在它將要運(yùn)行的環(huán)境中測(cè)試和調(diào)試執(zhí)行。
但是,它的配置更加復(fù)雜,至少需要兩個(gè)配置文件。
如果你的 cron 和 anacron 配置可以很好地為你服務(wù),那么可能沒(méi)有理由改變。但是 systemd 至少值得研究,因?yàn)樗梢院?jiǎn)化任何當(dāng)前的 cron/anacron 工作方式。
配置
systemd 定時(shí)器執(zhí)行功能至少需要兩個(gè)文件。這兩個(gè)是“定時(shí)器單元timer unit”和“服務(wù)單元service unit”。(其執(zhí)行的)“動(dòng)作”不僅僅是簡(jiǎn)單的命令,你還需要一個(gè)“作業(yè)”文件或腳本來(lái)執(zhí)行必要的功能。
定時(shí)器單元文件定義調(diào)度表,而服務(wù)單元文件定義執(zhí)行的任務(wù)。有關(guān)的更多詳細(xì)信息請(qǐng)參考 man systemd.timer 中提供的 .timer 單元。服務(wù)單元的詳細(xì)信息可在 man systemd.service 中找到。
單元文件存放在幾個(gè)位置(在手冊(cè)頁(yè)中有列出)。然而,對(duì)于普通用戶來(lái)說(shuō),最容易找到的位置可能是 ~/.config/systemd/user。請(qǐng)注意,這里的 user 是字符串 user。
示例
此示例是一個(gè)創(chuàng)建用戶調(diào)度作業(yè)而不是(以 root 用戶身份運(yùn)行的)系統(tǒng)調(diào)度作業(yè)的簡(jiǎn)單示例。它將消息、日期和時(shí)間打印到文件中。
1、首先創(chuàng)建一個(gè)執(zhí)行任務(wù)的 shell 腳本。在你的本地 bin 目錄中創(chuàng)建它,例如在 ~/bin/schedule-test.sh 中。
創(chuàng)建文件:
touch ~/bin/schedule-test.sh
然后將以下內(nèi)容添加到你剛剛創(chuàng)建的文件中:
#!/bin/sh
echo "This is only a test: $(date)" >> "$HOME/schedule-test-output.txt"
記住賦予你的 shell 腳本執(zhí)行權(quán)限。
2、創(chuàng)建 .service 單元調(diào)用上面的腳本。在以下位置創(chuàng)建目錄與文件:~/.config/systemd/user/schedule-test.service:
[Unit]
Description=A job to test the systemd scheduler
[Service]
Type=simple
ExecStart=/home//bin/schedule-test.sh
[Install]
WantedBy=default.target
請(qǐng)注意 應(yīng)該是你的家目錄地址,但是單元文件路徑名中的 user 實(shí)際上是字符串 user。
ExecStart 應(yīng)該提供一個(gè)沒(méi)有變量的絕對(duì)地址。例外情況是,對(duì)于用戶單元文件,你可以用 %h 替換 $HOME。換句話說(shuō),你可以使用:
ExecStart=%h/bin/schedule-test.sh
這僅用于用戶單元文件,而不適用于系統(tǒng)服務(wù),因?yàn)樵谙到y(tǒng)環(huán)境中運(yùn)行時(shí) %h 總是返回 /root。其他特殊符號(hào)可在 man systemd.unit 的 SPECIFIERS 中找到。因?yàn)樗隽吮疚牡姆秶?,所以這就是我們目前需要了解的關(guān)于特殊符號(hào)的全部?jī)?nèi)容。
3、創(chuàng)建一個(gè) .timer 單元文件,該文件實(shí)際上調(diào)度你創(chuàng)建的 .service 單元文件。在 .service 單元文件相同位置創(chuàng)建它:~/.config/systemd/user/schedule-test.timer。請(qǐng)注意,文件名僅在擴(kuò)展名上有所不同,例如一個(gè)是 .service,一個(gè)是 .timer。
[Unit]
Description=Schedule a message every 1 minute
RefuseManualStart=no # Allow manual starts
RefuseManualStop=no # Allow manual stops
[Timer]
#Execute job if it missed a run due to machine being off
Persistent=true
#Run 120 seconds after boot for the first time
OnBootSec=120
#Run every 1 minute thereafter
OnUnitActiveSec=60
#File describing job to execute
Unit=schedule-test.service
[Install]
WantedBy=timers.target
請(qǐng)注意,這個(gè) .timer 單元文件使用了 OnUnitActiveSec 來(lái)指定調(diào)度表。OnCalendar 選項(xiàng)更加靈活。例如:
# run on the minute of every minute every hour of every day
OnCalendar=*-*-* *:*:00
# run on the hour of every hour of every day
OnCalendar=*-*-* *:00:00
# run every day
OnCalendar=*-*-* 00:00:00
# run 11:12:13 of the first or fifth day of any month of the year
# 2012, but only if that day is a Thursday or Friday
OnCalendar=Thu,Fri 2012-*-1,5 11:12:13
有關(guān) OnCalendar 的更多信息參見(jiàn) 這里。
4、所有的部件都已就位,但你應(yīng)該進(jìn)行測(cè)試,以確保一切正常。首先,啟用該用戶服務(wù):
$ systemctl --user enable schedule-test.service
這將導(dǎo)致類似如下的輸出:
Created symlink /home//.config/systemd/user/default.target.wants/schedule-test.service → /home//.config/systemd/user/schedule-test.service.
現(xiàn)在執(zhí)行測(cè)試工作:
$ systemctl --user start schedule-test.service
檢查你的輸出文件($HOME/schedule-test-output.txt),確保你的腳本運(yùn)行正常。應(yīng)該只有一個(gè)條目,因?yàn)槲覀冞€沒(méi)有啟動(dòng)定時(shí)器。必要時(shí)進(jìn)行調(diào)試。如果你需要更改 .service 單元文件,而不是更改它調(diào)用的 shell 腳本,請(qǐng)不要忘記再次啟用該服務(wù)。
5、一旦作業(yè)正常運(yùn)行,通過(guò)為服務(wù)啟用、啟動(dòng)用戶定時(shí)器來(lái)實(shí)時(shí)調(diào)度作業(yè):
$ systemctl --user enable schedule-test.timer
$ systemctl --user start schedule-test.timer
請(qǐng)注意,你已經(jīng)在上面的步驟 4 中啟動(dòng)、啟用了服務(wù),因此只需要為它啟用、啟動(dòng)定時(shí)器。
enable 命令會(huì)產(chǎn)生如下輸出:
Created symlink /home//.config/systemd/user/timers.target.wants/schedule-test.timer → /home//.config/systemd/user/schedule-test.timer.
start 命令將只是返回命令行界面提示符。
其他操作
你可以檢查和監(jiān)控服務(wù)。如果你從系統(tǒng)服務(wù)收到錯(cuò)誤,下面的第一個(gè)命令特別有用:
$ systemctl --user status schedule-test
$ systemctl --user list-unit-files
手動(dòng)停止服務(wù):
$ systemctl --user stop schedule-test.service
永久停止并禁用定時(shí)器和服務(wù),重新加載守護(hù)程序配置并重置任何失敗通知:
$ systemctl --user stop schedule-test.timer
$ systemctl --user disable schedule-test.timer
$ systemctl --user stop schedule-test.service
$ systemctl --user disable schedule-test.service
$ systemctl --user daemon-reload
$ systemctl --user reset-failed
總結(jié)
本文以 systemd 定時(shí)器為出發(fā)點(diǎn),但是 systemd 的內(nèi)容遠(yuǎn)不止于此。這篇文章應(yīng)該為你提供一個(gè)基礎(chǔ)。你可以從 Fedora Magazine systemd 系列 開始探索更多。
參考
更多閱讀:
man systemd.timerman systemd.service- Use systemd timers instead of cronjobs
- Understanding and administering systemd
- https://opensource.com/ 內(nèi)有 systemd 速查表
本文名稱:用于調(diào)度任務(wù)的systemd定時(shí)器
本文URL:http://www.dlmjj.cn/article/djjpsoc.html


咨詢
建站咨詢
