新聞中心
學(xué)習(xí)使用 systemd 創(chuàng)建啟動你的游戲服務(wù)器的定時器。

成都創(chuàng)新互聯(lián)公司主要從事網(wǎng)頁設(shè)計、PC網(wǎng)站建設(shè)(電腦版網(wǎng)站建設(shè))、wap網(wǎng)站建設(shè)(手機版網(wǎng)站建設(shè))、成都響應(yīng)式網(wǎng)站建設(shè)公司、程序開發(fā)、網(wǎng)站優(yōu)化、微網(wǎng)站、微信小程序開發(fā)等,憑借多年來在互聯(lián)網(wǎng)的打拼,我們在互聯(lián)網(wǎng)網(wǎng)站建設(shè)行業(yè)積累了豐富的網(wǎng)站制作、網(wǎng)站設(shè)計、網(wǎng)站設(shè)計、網(wǎng)絡(luò)營銷經(jīng)驗,集策劃、開發(fā)、設(shè)計、營銷、管理等多方位專業(yè)化運作于一體。
之前,我們看到了如何手動的、在開機與關(guān)機時、在啟用某個設(shè)備時、在文件系統(tǒng)發(fā)生改變時 啟用與禁用 systemd 服務(wù)。
定時器增加了另一種啟動服務(wù)的方式,基于……時間。盡管與定時任務(wù)很相似,但 systemd 定時器稍微地靈活一些。讓我們看看它是怎么工作的。
“定時運行”
讓我們展開本系列前兩篇文章中你所設(shè)置的 Minetest 服務(wù)器作為如何使用定時器單元的第一個例子。如果你還沒有讀過那幾篇文章,可以現(xiàn)在去看看。
你將通過創(chuàng)建一個定時器來“改進” Minetest 服務(wù)器,使得在服務(wù)器啟動 1 分鐘后運行游戲服務(wù)器而不是立即運行。這樣做的原因可能是,在啟動之前可能會用到其他的服務(wù),例如發(fā)郵件給其他玩家告訴他們游戲已經(jīng)準備就緒,你要確保其他的服務(wù)(例如網(wǎng)絡(luò))在開始前完全啟動并運行。
最終,你的 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] 這一節(jié)是新出現(xiàn)的,但它的作用不言自明:它包含了何時啟動服務(wù),啟動哪個服務(wù)的信息。在這個例子當中,OnBootSec 是告訴 systemd 在系統(tǒng)啟動后運行服務(wù)的指令。
其他的指令有:
OnActiveSec=,告訴 systemd 在定時器啟動后多長時間運行服務(wù)。OnStartupSec=,同樣的,它告訴 systemd 在 systemd 進程啟動后多長時間運行服務(wù)。OnUnitActiveSec=,告訴 systemd 在上次由定時器激活的服務(wù)啟動后多長時間運行服務(wù)。OnUnitInactiveSec=,告訴 systemd 在上次由定時器激活的服務(wù)停用后多長時間運行服務(wù)。
繼續(xù) minetest.timer 單元,basic.target 通常用作后期引導(dǎo)服務(wù)late boot services的同步點synchronization point。這就意味著它可以讓 minetest.timer 單元運行在安裝完本地掛載點local mount points或交換設(shè)備,套接字、定時器、路徑單元和其他基本的初始化進程之后。就像在第二篇文章中 systemd 單元里解釋的那樣,targets 就像舊的運行等級old run levels一樣,可以將你的計算機置于某個狀態(tài),或像這樣告訴你的服務(wù)在達到某個狀態(tài)后開始運行。
在前兩篇文章中你配置的 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(發(fā)送你的 email 的腳本)從:
#!/bin/bash
# mtsendmail
sleep 20
echo $1 | mutt -F /home//.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 現(xiàn)在來做等待。
讓它運行起來
確保一切運作正常,禁用 minetest.service:
sudo systemctl disable minetest
這使得系統(tǒng)啟動時它不會一同啟動;然后,相反地,啟用 minetest.timer:
sudo systemctl enable minetest.timer
現(xiàn)在你就可以重啟服務(wù)器了,當運行 sudo journalctl -u minetest.* 后,你就會看到 minetest.timer 單元執(zhí)行后大約一分鐘,minetest.service 單元開始運行。
圖 1:minetest.timer 運行大約 1 分鐘后 minetest.service 開始運行
時間的問題
minetest.timer 在 systemd 的日志里顯示的啟動時間為 09:08:33 而 minetest.service 啟動時間是 09:09:18,它們之間少于 1 分鐘,關(guān)于這件事有幾點需要說明一下:首先,請記住我們說過 OnBootSec= 指令是從引導(dǎo)完成后開始計算服務(wù)啟動的時間。當 minetest.timer 的時間到來時,引導(dǎo)已經(jīng)在幾秒之前完成了。
另一件事情是 systemd 給自己設(shè)置了一個誤差幅度margin of error(默認是 1 分鐘)來運行東西。這有助于在多個資源密集型進程resource-intensive processes同時運行時分配負載:通過分配 1 分鐘的時間,systemd 可以等待某些進程關(guān)閉。這也意味著 minetest.service 會在引導(dǎo)完成后的 1~2 分鐘之間啟動。但精確的時間誰也不知道。
順便一提,你可以用 AccuracySec= 指令修改誤差幅度。
你也可以檢查系統(tǒng)上所有的定時器何時運行或是上次運行的時間:
systemctl list-timers --all
圖 2:檢查定時器何時運行或上次運行的時間
最后一件值得思考的事就是你應(yīng)該用怎樣的格式去表示一段時間。Systemd 在這方面非常靈活:2 h,2 hours 或 2hr 都可以用來表示 2 個小時。對于“秒”,你可以用 seconds,second,sec 和 s?!胺帧币彩峭瑯拥姆绞剑?code>minutes,minute,min 和 m。你可以檢查 man systemd.time 來查看 systemd 能夠理解的所有時間單元。
下一次
下次你會看到如何使用日歷中的日期和時間來定期運行服務(wù),以及如何通過組合定時器與設(shè)備單元在插入某些硬件時運行服務(wù)。
回頭見!
在 Linux 基金會和 edx 上通過免費課程 “Introduction to Linux” 學(xué)習(xí)更多關(guān)于 Linux 的知識。
網(wǎng)站名稱:在Linux上使用systemd設(shè)置定時器
網(wǎng)頁網(wǎng)址:http://www.dlmjj.cn/article/djpgego.html


咨詢
建站咨詢
