Linux中國

在 Linux 上使用 systemd 設置定時器

之前,我們看到了如何手動的、在開機與關機時、在啟用某個設備時、在文件系統發生改變時 啟用與禁用 systemd 服務。

定時器增加了另一種啟動服務的方式,基於……時間。儘管與定時任務很相似,但 systemd 定時器稍微地靈活一些。讓我們看看它是怎麼工作的。

「定時運行」

讓我們展開本系列前兩篇文章中你所設置的 Minetest 伺服器作為如何使用定時器單元的第一個例子。如果你還沒有讀過那幾篇文章,可以現在去看看。

你將通過創建一個定時器來「改進」 Minetest 伺服器,使得在伺服器啟動 1 分鐘後運行遊戲伺服器而不是立即運行。這樣做的原因可能是,在啟動之前可能會用到其他的服務,例如發郵件給其他玩家告訴他們遊戲已經準備就緒,你要確保其他的服務(例如網路)在開始前完全啟動並運行。

最終,你的 minetest.timer 單元看起來就像這樣:

# minetest.timer
[Unit]
Description=Runs the minetest.service 1 minute after boot up

[Timer]
OnBootSec=1 m
Unit=minetest.service

[Install]
WantedBy=basic.target

一點也不難吧。

如以往一般,開頭是 [Unit] 和一段描述單元作用的信息,這兒沒什麼新東西。[Timer] 這一節是新出現的,但它的作用不言自明:它包含了何時啟動服務,啟動哪個服務的信息。在這個例子當中,OnBootSec 是告訴 systemd 在系統啟動後運行服務的指令。

其他的指令有:

  • OnActiveSec=,告訴 systemd 在定時器啟動後多長時間運行服務。
  • OnStartupSec=,同樣的,它告訴 systemd 在 systemd 進程啟動後多長時間運行服務。
  • OnUnitActiveSec=,告訴 systemd 在上次由定時器激活的服務啟動後多長時間運行服務。
  • OnUnitInactiveSec=,告訴 systemd 在上次由定時器激活的服務停用後多長時間運行服務。

繼續 minetest.timer 單元,basic.target 通常用作 後期引導服務 late boot services 的 同步點 synchronization point 。這就意味著它可以讓 minetest.timer 單元運行在安裝完 本地掛載點 local mount points 或交換設備,套接字、定時器、路徑單元和其他基本的初始化進程之後。就像在第二篇文章中 systemd 單元里解釋的那樣,targets 就像 舊的運行等級 old run levels 一樣,可以將你的計算機置於某個狀態,或像這樣告訴你的服務在達到某個狀態後開始運行。

在前兩篇文章中你配置的 minetest.service 文件最終看起來就像這樣:

# minetest.service
[Unit]
Description= Minetest server
Documentation= https://wiki.minetest.net/Main_Page

[Service]
Type= simple
User=

ExecStart= /usr/games/minetest --server
ExecStartPost= /home//bin/mtsendmail.sh "Ready to rumble?" "Minetest Starting up"

TimeoutStopSec= 180
ExecStop= /home//bin/mtsendmail.sh "Off to bed. Nightie night!" "Minetest Stopping in 2 minutes"
ExecStop= /bin/sleep 120
ExecStop= /bin/kill -2 $MAINPID

[Install]
WantedBy= multi-user.target

這兒沒什麼需要修改的。但是你需要將 mtsendmail.sh(發送你的 email 的腳本)從:

#!/bin/bash
# mtsendmail
sleep 20
echo $1 | mutt -F /home/<username>/.muttrc -s "$2" my_minetest@mailing_list.com
sleep 10

改成:

#!/bin/bash
# mtsendmail.sh
echo $1 | mutt -F /home/paul/.muttrc -s "$2" pbrown@mykolab.com

你做的事是去除掉 Bash 腳本中那些蹩腳的停頓。Systemd 現在來做等待。

讓它運行起來

確保一切運作正常,禁用 minetest.service:

sudo systemctl disable minetest

這使得系統啟動時它不會一同啟動;然後,相反地,啟用 minetest.timer:

sudo systemctl enable minetest.timer

現在你就可以重啟伺服器了,當運行 sudo journalctl -u minetest.* 後,你就會看到 minetest.timer 單元執行後大約一分鐘,minetest.service 單元開始運行。

![minetest timer](/data/attachment/album/201811/01/221418yyzjjv5060jv0a5e.png "minetest timer")

圖 1:minetest.timer 運行大約 1 分鐘後 minetest.service 開始運行

時間的問題

minetest.timer 在 systemd 的日誌里顯示的啟動時間為 09:08:33 而 minetest.service 啟動時間是 09:09:18,它們之間少於 1 分鐘,關於這件事有幾點需要說明一下:首先,請記住我們說過 OnBootSec= 指令是從引導完成後開始計算服務啟動的時間。當 minetest.timer 的時間到來時,引導已經在幾秒之前完成了。

另一件事情是 systemd 給自己設置了一個 誤差幅度 margin of error (默認是 1 分鐘)來運行東西。這有助於在多個 資源密集型進程 resource-intensive processes 同時運行時分配負載:通過分配 1 分鐘的時間,systemd 可以等待某些進程關閉。這也意味著 minetest.service 會在引導完成後的 1~2 分鐘之間啟動。但精確的時間誰也不知道。

順便一提,你可以用 AccuracySec= 指令修改誤差幅度。

你也可以檢查系統上所有的定時器何時運行或是上次運行的時間:

systemctl list-timers --all

![check timer](/data/attachment/album/201811/01/221426vizdi0z11zjr42mu.png "check timer")

圖 2:檢查定時器何時運行或上次運行的時間

最後一件值得思考的事就是你應該用怎樣的格式去表示一段時間。Systemd 在這方面非常靈活:2 h,2 hours 或 2hr 都可以用來表示 2 個小時。對於「秒」,你可以用 seconds,second,sec 和 s。「分」也是同樣的方式:minutes,minute,min 和 m。你可以檢查 man systemd.time 來查看 systemd 能夠理解的所有時間單元。

下一次

下次你會看到如何使用日曆中的日期和時間來定期運行服務,以及如何通過組合定時器與設備單元在插入某些硬體時運行服務。

回頭見!

在 Linux 基金會和 edx 上通過免費課程 「Introduction to Linux」 學習更多關於 Linux 的知識。

via: https://www.linux.com/blog/learn/intro-to-linux/2018/7/setting-timer-systemd-linux

作者:Paul Brown 選題:lujun9972 譯者:LuuMing 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的郵箱地址不會被公開。 必填項已用 * 標註

    這個站點使用 Akismet 來減少垃圾評論。了解你的評論數據如何被處理。

    More in:Linux中國

    Linux中國

    捐贈 Let&apos;s Encrypt,共建安全的互聯網

    隨著 Mozilla、蘋果和谷歌對沃通和 StartCom 這兩家 CA 公司處罰落定,很多使用這兩家 CA 所簽發證書的網站紛紛尋求新的證書籤發商。有一個非盈利組織可以為大家提供了免費、可靠和安全的 SSL 證書服務,這就是 Let's Encrypt 項目。現在,它需要您的幫助
    Linux中國

    關於Linux防火牆iptables的面試問答

    Nishita Agarwal是Tecmint的用戶,她將分享關於她剛剛經歷的一家公司(印度的一家私人公司Pune)的面試經驗。在面試中她被問及許多不同的問題,但她是iptables方面的專家,因此她想分享這些關於iptables的問題和相應的答案給那些以後可能會進行相關面試的人。 所有的問題和相應的答案都基於Nishita Agarwal的記憶並經過了重寫。 嗨,朋友!我叫Nishita Agarwal。我已經取得了理學學士學位,我的專業集中在UNIX和它的變種(BSD,Linux)。它們一直深深的吸引著我。我在存儲方面有1年多的經驗。我正在尋求職業上的變化,並將供職於印度的P
    Linux中國

    Lets Encrypt 已被所有主流瀏覽器所信任

    旨在讓每個網站都能使用 HTTPS 加密的非贏利組織 Lets Encrypt 已經得了 IdenTrust的交叉簽名,這意味著其證書現在已經可以被所有主流的瀏覽器所信任。從這個裡程碑事件開始,訪問者訪問使用了Lets Encrypt 證書的網站不再需要特別配置就可以得到 HTTPS 安全保護了。 Lets Encrypt 的兩個中級證書 ...