您好,登錄后才能下訂單哦!
這篇文章的內容主要圍繞在Linux系統下使用Systemd定時器的基礎是什么進行講述,文章內容清晰易懂,條理清晰,非常適合新手學習,值得大家去閱讀。感興趣的朋友可以跟隨小編一起閱讀吧。希望大家通過這篇文章有所收獲!
下面介紹用于調度任務的Systemd定時器(Systemd Timer),也是一篇在Linux系統下使用Systemd定時器的基礎文章。將展示如何在Systemd中使用定時器在系統啟動后并在此后重復運行任務。當前Systemd已經提供了一段時間的定時器,作為cron的替代品,該功能值得一看。
Cron vs anacron vs systemd
Cron可以安排任務以從幾分鐘到幾個月或更長時間的運行。設置相對簡單,只需要一個配置文件。雖然配置行有點深奧,不過一般用戶也可以使用。
但是,如果您的系統在適當的執行時間發生時沒有運行,則Cron會失敗。
Anacron,克服了“系統未運行”的問題。它確保當您的系統再次處于活動狀態時將執行任務。雖然它旨在供管理員使用,但某些系統為一般用戶提供訪問權限。
但是,執行的anacron頻率可以不少于每天。
cron和anacron都存在執行上下文的一致性問題。必須注意任務運行時有效的環境與測試時使用的環境完全相同。必須提供相同的shell、環境變量和路徑。這意味著測試和調試有時會很困難。
Systemd定時器提供了cron和anacron的最佳功能。允許調度到分鐘粒度。確保任務將在系統再次運行時執行,即使它在預期的執行時間內關閉。可供所有用戶使用。您可以在它將運行的環境中測試和調試執行。
但是配置比較復雜,至少需要兩個配置文件。
如果您的cron和anacron配置很好地為您服務,那么可能沒有理由改變。但systemd至少值得研究,因為它可以簡化任何當前的cron /anacron解決方法。
參考: 在Linux系統下使用Crontab UI安全管理Cron定時任務。
配置
Systemd定時器執行的函數至少需要兩個文件。它們是“timer unit”和“service unit”。操作不僅僅是一個簡單的命令,您還需要一個“job”文件或腳本來執行必要的功能。
定時器單元文件定義調度,而服務單元文件定義執行的任務。有關.timer單元的更多詳細信息,請參閱“man systemd.timer”。有關服務單元的詳細信息,請參見“man systemd.service”。
單元文件存在于多個位置(在手冊頁中列出)。然而,對于一般用戶來說,最簡單的位置可能是“~/.config/systemd/user”。請注意,此處的“user”是文字字符串“user”。
示例
這個示例是一個簡單的例子,創建一個用戶計劃作業而不是系統計劃作業(它將以root身份運行)。它將消息、日期和時間打印到文件中。
1、首先創建一個將執行任務的shell腳本。在本地“bin”目錄中創建它,例如,在“~/bin/schedule-test.sh”。
要創建文件:
touch ~/bin/schedule-test.sh
然后將以下內容添加到您剛剛創建的文件中:
#!/bin/sh
echo 'This is only a test: $(date)' >> '$HOME/schedule-test-output.txt'
請記住使您的 shell 腳本可執行。
2、創建將調用上述腳本的.service單元。在“~/.config/systemd/user/schedule-test.service”位置創建目錄和文件:
[Unit] Description=A job to test the systemd scheduler [Service] Type=simple ExecStart=/home/<user>/bin/schedule-test.sh [Install] WantedBy=default.target
請注意,<user>應該是您的@HOME地址,但單元文件路徑名中的“user”實際上是字符串“user”。
ExecStart行應該提供一個沒有變量的絕對地址。一個例外是,對于用戶單位,您可以將“%h”替換為$HOME。換句話說,您可以使用:
ExecStart=%h/bin/schedule-test.sh
這僅用于用戶單元文件使用。這對系統單元不利,因為“%h”在系統環境中運行時將始終返回“/root”。其他替換在“man systemd.unit”中的“SPECIFIERS”標題下找到。由于它超出了本文的范圍,這就是我們現在需要了解的有關SPECIFIERS的全部內容。
3、創建一個.timer單元文件,它實際調度您剛剛創建的.service單元。在與.service文件“~/.config/systemd/user/schedule-test.timer”相同的位置創建它。請注意,文件名僅在擴展名上有所不同,即“.service”與“.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 請注意,.timer文件已使用“OnUnitActiveSec”來指定時間表。“OnCalendar”選項更加靈活。例如: # 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 2021-*-1,5 11:12:13
4、所有部分都已就位,但您應該進行測試以確保一切正常。首先,啟用用戶服務:
$ systemctl --user enable schedule-test.service
這應該會產生類似于以下內容的輸出:
Created symlink /home/<user>/.config/systemd/user/default.target.wants/schedule-test.service → /home/<user>/.config/systemd/user/schedule-test.service.
現在對作業進行測試運行:
$ systemctl --user start schedule-test.service
檢查您的輸出文件($HOME/schedule-test-output.txt)以確保您的腳本是正確執行。因為我們還沒有啟動定時器,所以應該有一個條目。根據需要進行調試。如果您需要更改.service文件而不是它調用的shell腳本,請不要忘記再次啟用該服務。
5、作業正常工作后,通過為您的服務啟用和啟動用戶定時器來實時安排它:
$ systemctl --user enable schedule-test.timer
$ systemctl --user start schedule-test.timer
請注意,您已經在上面的步驟4中啟動并啟用了該服務,因此只需為其啟用和啟動定時器即可。
“enable”命令將導致類似以下的輸出:
Created symlink /home/<user>/.config/systemd/user/timers.target.wants/schedule-test.timer → /home/<user>/.config/systemd/user/schedule-test.timer.
并且“start”只會讓您返回到CLI提示符。
其他操作
您可以檢查和監控服務。如果您收到來自服務單元的錯誤,下面的第一個命令特別有用:
$ systemctl --user status schedule-test
$ systemctl --user list-unit-files
手動停止服務:
$ systemctl --user stop schedule-test.service
永久停止和禁用定時器和服務,重新加載守護程序配置并重置任何失敗通知:
$ 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
Linux是一種免費使用和自由傳播的類UNIX操作系統,是一個基于POSIX的多用戶、多任務、支持多線程和多CPU的操作系統,使用Linux能運行主要的Unix工具軟件、應用程序和網絡協議。
感謝你的閱讀,相信你對“在Linux系統下使用Systemd定時器的基礎是什么”這一問題有一定的了解,快去動手實踐吧,如果想了解更多相關知識點,可以關注億速云網站!小編會繼續為大家帶來更好的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。