自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

在Linux上使用systemd設(shè)置定時(shí)器

系統(tǒng) Linux 系統(tǒng)運(yùn)維
學(xué)習(xí)使用 systemd 創(chuàng)建啟動(dòng)你的游戲服務(wù)器的定時(shí)器。定時(shí)器增加了另一種啟動(dòng)服務(wù)的方式,基于……時(shí)間。盡管與定時(shí)任務(wù)很相似,但 systemd 定時(shí)器稍微地靈活一些。讓我們看看它是怎么工作的。

[[248426]]

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

之前,我們看到了如何手動(dòng)的、在開機(jī)與關(guān)機(jī)時(shí)、在啟用某個(gè)設(shè)備時(shí)、在文件系統(tǒng)發(fā)生改變時(shí) 啟用與禁用 systemd 服務(wù)。

定時(shí)器增加了另一種啟動(dòng)服務(wù)的方式,基于……時(shí)間。盡管與定時(shí)任務(wù)很相似,但 systemd 定時(shí)器稍微地靈活一些。讓我們看看它是怎么工作的。

“定時(shí)運(yùn)行”

讓我們展開本系列前兩篇文章你所設(shè)置的 Minetest 服務(wù)器作為如何使用定時(shí)器單元的***個(gè)例子。如果你還沒有讀過那幾篇文章,可以現(xiàn)在去看看。

你將通過創(chuàng)建一個(gè)定時(shí)器來(lái)“改進(jìn)” Minetest 服務(wù)器,使得在服務(wù)器啟動(dòng) 1 分鐘后運(yùn)行游戲服務(wù)器而不是立即運(yùn)行。這樣做的原因可能是,在啟動(dòng)之前可能會(huì)用到其他的服務(wù),例如發(fā)郵件給其他玩家告訴他們游戲已經(jīng)準(zhǔn)備就緒,你要確保其他的服務(wù)(例如網(wǎng)絡(luò))在開始前完全啟動(dòng)并運(yùn)行。

最終,你的 minetest.timer 單元看起來(lái)就像這樣:

  1. # minetest.timer
  2. [Unit]
  3. Description=Runs the minetest.service 1 minute after boot up
  4.  
  5. [Timer]
  6. OnBootSec=1 m
  7. Unit=minetest.service
  8.  
  9. [Install]
  10. WantedBy=basic.target

一點(diǎn)也不難吧。

如以往一般,開頭是 [Unit] 和一段描述單元作用的信息,這兒沒什么新東西。[Timer] 這一節(jié)是新出現(xiàn)的,但它的作用不言自明:它包含了何時(shí)啟動(dòng)服務(wù),啟動(dòng)哪個(gè)服務(wù)的信息。在這個(gè)例子當(dāng)中,OnBootSec 是告訴 systemd 在系統(tǒng)啟動(dòng)后運(yùn)行服務(wù)的指令。

其他的指令有:

  • OnActiveSec=,告訴 systemd 在定時(shí)器啟動(dòng)后多長(zhǎng)時(shí)間運(yùn)行服務(wù)。
  • OnStartupSec=,同樣的,它告訴 systemd 在 systemd 進(jìn)程啟動(dòng)后多長(zhǎng)時(shí)間運(yùn)行服務(wù)。
  • OnUnitActiveSec=,告訴 systemd 在上次由定時(shí)器激活的服務(wù)啟動(dòng)后多長(zhǎng)時(shí)間運(yùn)行服務(wù)。
  • OnUnitInactiveSec=,告訴 systemd 在上次由定時(shí)器激活的服務(wù)停用后多長(zhǎng)時(shí)間運(yùn)行服務(wù)。

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

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

  1. # minetest.service
  2. [Unit]
  3. Description= Minetest server
  4. Documentation= https://wiki.minetest.net/Main_Page
  5.  
  6. [Service]
  7. Type= simple
  8. User=
  9.  
  10. ExecStart= /usr/games/minetest --server
  11. ExecStartPost= /home//bin/mtsendmail.sh "Ready to rumble?" "Minetest Starting up"
  12.  
  13. TimeoutStopSec= 180
  14. ExecStop= /home//bin/mtsendmail.sh "Off to bed. Nightie night!" "Minetest Stopping in 2 minutes"
  15. ExecStop= /bin/sleep 120
  16. ExecStop= /bin/kill -2 $MAINPID
  17.  
  18. [Install]
  19. WantedBy= multi-user.target

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

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

改成:

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

你做的事是去除掉 Bash 腳本中那些蹩腳的停頓。Systemd 現(xiàn)在來(lái)做等待。

讓它運(yùn)行起來(lái)

確保一切運(yùn)作正常,禁用 minetest.service

  1. sudo systemctl disable minetest

這使得系統(tǒng)啟動(dòng)時(shí)它不會(huì)一同啟動(dòng);然后,相反地,啟用 minetest.timer

  1. sudo systemctl enable minetest.timer

現(xiàn)在你就可以重啟服務(wù)器了,當(dāng)運(yùn)行 sudo journalctl -u minetest.* 后,你就會(huì)看到 minetest.timer 單元執(zhí)行后大約一分鐘,minetest.service 單元開始運(yùn)行。

圖 1:minetest.timer 運(yùn)行大約 1 分鐘后 minetest.service 開始運(yùn)行

圖 1:minetest.timer 運(yùn)行大約 1 分鐘后 minetest.service 開始運(yùn)行

時(shí)間的問題

minetest.timer 在 systemd 的日志里顯示的啟動(dòng)時(shí)間為 09:08:33 而 minetest.service 啟動(dòng)時(shí)間是 09:09:18,它們之間少于 1 分鐘,關(guān)于這件事有幾點(diǎn)需要說明一下:首先,請(qǐng)記住我們說過 OnBootSec= 指令是從引導(dǎo)完成后開始計(jì)算服務(wù)啟動(dòng)的時(shí)間。當(dāng) minetest.timer 的時(shí)間到來(lái)時(shí),引導(dǎo)已經(jīng)在幾秒之前完成了。

另一件事情是 systemd 給自己設(shè)置了一個(gè)誤差幅度margin of error(默認(rèn)是 1 分鐘)來(lái)運(yùn)行東西。這有助于在多個(gè)資源密集型進(jìn)程resource-intensive processes同時(shí)運(yùn)行時(shí)分配負(fù)載:通過分配 1 分鐘的時(shí)間,systemd 可以等待某些進(jìn)程關(guān)閉。這也意味著 minetest.service 會(huì)在引導(dǎo)完成后的 1~2 分鐘之間啟動(dòng)。但精確的時(shí)間誰(shuí)也不知道。

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

你也可以檢查系統(tǒng)上所有的定時(shí)器何時(shí)運(yùn)行或是上次運(yùn)行的時(shí)間:

  1. systemctl list-timers --all

圖 2:檢查定時(shí)器何時(shí)運(yùn)行或上次運(yùn)行的時(shí)間

圖 2:檢查定時(shí)器何時(shí)運(yùn)行或上次運(yùn)行的時(shí)間

***一件值得思考的事就是你應(yīng)該用怎樣的格式去表示一段時(shí)間。Systemd 在這方面非常靈活:2 h,2 hours2hr 都可以用來(lái)表示 2 個(gè)小時(shí)。對(duì)于“秒”,你可以用 seconds,secondsecs。“分”也是同樣的方式:minutes,minuteminm。你可以檢查 man systemd.time 來(lái)查看 systemd 能夠理解的所有時(shí)間單元。

下一次

下次你會(huì)看到如何使用日歷中的日期和時(shí)間來(lái)定期運(yùn)行服務(wù),以及如何通過組合定時(shí)器與設(shè)備單元在插入某些硬件時(shí)運(yùn)行服務(wù)。 

責(zé)任編輯:龐桂玉 來(lái)源: Linux中國(guó)
相關(guān)推薦

2021-04-18 12:12:29

systemd定時(shí)器系統(tǒng)運(yùn)維

2021-08-03 14:33:53

cron定時(shí)器Linux命令

2018-12-03 12:20:52

Systemd定時(shí)器Linux

2009-11-11 10:14:10

linux定時(shí)器操作系統(tǒng)

2021-06-28 06:00:11

systemd定時(shí)器系統(tǒng)運(yùn)維

2023-01-10 13:53:21

Linux定時(shí)器

2023-12-11 09:50:35

Linux定時(shí)器

2020-10-26 12:30:23

LinuxyumZFS

2021-08-11 10:10:26

Linux定時(shí)器數(shù)組

2010-07-28 15:56:22

FlexTimer定時(shí)

2024-11-12 14:48:10

2009-08-03 12:15:29

linux at命令linux at命令詳定時(shí)啟動(dòng)程序

2011-02-23 10:20:45

2009-04-12 08:51:50

Symbian諾基亞移動(dòng)OS

2013-07-29 10:10:40

TCP協(xié)議TCP定時(shí)器TCP

2021-03-31 08:33:17

SysTick定時(shí)器SysTick定時(shí)器

2011-04-21 10:49:28

Linux時(shí)間定時(shí)器

2022-11-02 11:40:16

Flowable定時(shí)器流程

2023-08-02 09:26:03

軟件定時(shí)器鴻蒙

2019-12-05 10:30:17

LinuxMultitail
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)