Linux systemd 定時任務

来源:https://www.cnblogs.com/edisonfish/p/18136713
-Advertisement-
Play Games

哈嘍大家好,我是鹹魚。 說到 Linux 定時任務,大家用得最多的就是 crond 服務,但其實 systemd 也有類似的功能。我們不但可以通過 systemd 來管理服務,還能設置定時任務,那就是 systemd timer。 與 crond 相比,systemd 定時任務具有以下優點: 更高的 ...


哈嘍大家好,我是鹹魚。

說到 Linux 定時任務,大家用得最多的就是 crond 服務,但其實 systemd 也有類似的功能。我們不但可以通過 systemd 來管理服務,還能設置定時任務,那就是 systemd timer。

與 crond 相比,systemd 定時任務具有以下優點:

  • 更高的精度:systemd 定時任務可以精確到秒,而 crond 只能精確到分鐘。
  • 可以限制資源使用:使用 systemd 定時任務可以設置記憶體和 CPU 的使用限制,比如最多使用 50% 的 CPU。
  • 更靈活的配置:systemd 定時任務可以通過條件、依賴關係等進行配置,以控制任務的執行。相比之下,crond 的配置相對簡單,靈活性較低。

舉個例子,假設我們要通過 crond 配置多個大文件的遠程備份(使用 scp、rsync 或 ftp 的方式),但由於大文件的網路傳輸時間不確定,因此下一個文件的備份任務開始時間幾乎都是按照經驗估計的。

這可能導致上一個任務的網路傳輸尚未完成,下一個任務已經開始,同時占用網路帶寬,然後又啟動了下一個任務,形成惡性迴圈。

而使用 systemd timer 可以建立任務之間的依賴關係,例如在第一個備份任務完成後再啟動第二個備份任務,以此類推。

systemd timer 原理

systemd 定時任務基於 systemd 的單元管理器。它使用兩種類型的單元來管理定時任務:.timer 單元和 .service 單元。

  • .timer 單元:
    • .timer 單元定義了定時規則,包括啟動時間、間隔時間等。
    • 每個 .timer 單元都對應一個或多個關聯的 .service 單元。
  • .service 單元:
    • .service 單元定義了要在計時器觸發時運行的服務或命令。
    • .timer 觸發時,相關聯的 .service 單元將被啟動。

systemd 定時任務原理是:systemd 定期檢查每個 .timer 單元中定義的定時規則,以確定是否觸發相應的定時器。一旦定時器觸發,systemd 將啟動與該定時器關聯的 .service 單元,從而執行預定的任務。

在正式介紹 systemd 定時任務之前,我們先要瞭解什麼是單元(unit)。

systemd 單元

簡單來講,單元就是 systemd 的最小管理單位,是單個進程的描述。一個個單元相互調用和依賴,組成一個龐大的任務管理系統。

systemd 中的 unit 有很多類型,下麵是一些常見的 unit 類型:

  • .service:service 單元,也就是我們常說的系統服務
  • .target:target 單元,其實就是一堆 unit 的集合,比如常見的 multi-user.target
  • .timer:timer 單元,負責定時任務。
  • .slice:slice 單元,負責資源的分配。

每個 unit 都有一個描述文件(unit 負責乾什麼、怎麼乾...),它們分散在三個目錄:

  • /lib/systemd/system:系統預設的 unit 文件
  • /etc/systemd/system:包含用戶自定義的 unit 文件,如果設置了開機自啟動,則該目錄下的 unit 描述文件會創建一個符號鏈接。
  • /usr/lib/systemd/system:用戶自己定義的 unit 文件,也會包含一些系統預設的 unit 文件

大多數 linux 發行版中 /lib/usr/lib的軟鏈接,所以 1 和 3 其實是同一目錄,作用自然應該是相同的。

其實可以簡單分成兩類:

  • /etc/systemd/system:用戶自定義的 unit 文件
  • /usr/lib/systemd/system:系統預設的 unit 文件和用戶安裝軟體的 unit 文件
# 查看所有 unit
$ systemctl list-unit-files

# 查看所有 Service unit
$ systemctl list-unit-files --type service

# 查看所有 Timer unit
$ systemctl list-unit-files --type timer

關於 systemd unit 相關的內容這裡就不細講了,大家可以看我之前的文章:《systemctl 命令設置開機自啟動失敗

設置 systemd 定時任務

有一個檢查 https 證書是否過期的腳本 check_https.sh,我們現在需要系統定期執行這個腳本,除此之外,系統在開機之後也會執行這個腳本。

首先創建一個 service unit

[root@localhost ~]# cat /usr/lib/systemd/system/check-https.service
[Unit]
Description=check https certificates

[Service]
Type=oneshot
ExecStart=check_https.sh

[Install]
WantedBy=multi-user.target

Type=oneshot 表示 service 以一次性(Oneshot)方式運行。這意味著當啟動 service 時,它將執行一次,併在完成後退出。

然後我們創建一個 timer unit

Service unit 只是定義瞭如何執行任務,要定時執行這個 Service,還必須定義 Timer unit

[root@localhost ~]# cat /usr/lib/systemd/system/check-https.timer
[Unit]
Description=Runs check https every day

[Timer]
OnUnitActiveSec=24h
Unit=check-https.service

[Install]
WantedBy=multi-user.target

我們著重來看下 [Timer] 部分:

  • OnActiveSec:定時任務生效後,多少時間開始執行任務
  • OnBootSec:系統啟動後,多少時間開始執行任務
  • OnStartupSec:Systemd 進程啟動後,多少時間開始執行任務
  • OnUnitActiveSec:該 unit 上次執行後,等多少時間再次執行
  • OnUnitInactiveSec: 定時任務上次關閉後多少時間,再次執行
  • OnCalendar:基於絕對時間,而不是相對時間執行
  • AccuracySec:如果因為各種原因,任務必須推遲執行,推遲的最大秒數,預設是60秒
  • Unit:真正要執行的任務,預設是同名的帶有.service 尾碼的 unit
  • Persistent:如果設置了該欄位,即使定時任務到時沒有啟動,也會自動執行相應的 unit
  • WakeSystem:如果系統休眠,是否自動喚醒系統

上面的 timer 文件里,OnUnitActiveSec=24h 表示 24 小時執行一次任務。

下麵是其他的寫法:

1、在系統啟動 15 分鐘後執行,併在系統運行時,每周執行一次

[Timer]
OnBootSec=15min
OnUnitActiveSec=1w
Unit=check-https.service

2、每周周一執行,如果到時定時任務沒有啟動,會立即執行

[Timer]
OnCalendar=weekly
Persistent=true
Unit=check-https.service

3、每周日凌晨三點執行(時間格式:Year-Month-Day Hour:Minute:Second

[Timer]
OnCalendar=Sun *-*-* 03:00:00
Unit=check-https.service

官方文檔:https://www.freedesktop.org/software/systemd/man/latest/systemd.time.html

然後我們啟動這個定時任務,並設置開機自啟動

# 重新載入配置
systemctl  daemon-reload

systemctl start check-https.timer

systemctl enable check-https.timer

其他一些定時任務命令:

# 查看所有正在運行的定時任務
systemctl list-timers

# 關閉定時任務
systemctl stop check-https.timer

# 查看定時任務狀態
systemctl status check-https.timer

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 為.net6在CentOS7上面做準備,先在vmware虛擬機安裝CentOS 7.9 新建CentOS764位的系統 因為CentOS8不更新了,所以安裝7;簡單就一筆帶過了 選擇下載好的操作系統的iso文件,下載地址https://mirrors.aliyun.com/centos/7.9.20 ...
  • 引言 上一章節介紹了 TDD 的三大法則,今天我們講一下在單元測試中模擬對象的使用。 Fake Fake - Fake 是一個通用術語,可用於描述 stub或 mock 對象。 它是 stub 還是 mock 取決於使用它的上下文。 也就是說,Fake 可以是 stub 或 mock Mock - ...
  • 概述:WPF界面綁定和渲染大量數據可能導致性能問題。通過啟用UI虛擬化、非同步載入和數據分頁,可以有效提高界面響應性能。以下是簡單示例演示這些優化方法。 在WPF中,當你嘗試綁定和渲染大量的數據項時,性能問題可能出現。以下是一些可能導致性能慢的原因以及優化方法: UI 虛擬化: WPF提供了虛擬化技術 ...
  • 1.Linux上安裝Docken 伺服器系統版本以及內核版本:cat /etc/redhat-release 查看伺服器內核版本:uname -r 安裝依賴包:yum install -y yum-utils device-mapper-persistent-data lvm2 設置阿裡雲鏡像源:y ...
  • 概述:通過使用`SemaphoreSlim`,可以簡單而有效地限制非同步HTTP請求的併發量,確保在任何給定時間內不超過20個網頁同時下載。`ParallelOptions`不適用於非同步操作,但可考慮使用`Parallel.ForEach`,儘管在非同步場景中謹慎使用。 對於併發非同步 I/O 操作的數量 ...
  • 隨著Aspire發佈preview5的發佈,Microsoft.Extensions.ServiceDiscovery隨之更新, 服務註冊發現這個屬於老掉牙的話題解決什麼問題就不贅述了,這裡主要講講Microsoft.Extensions.ServiceDiscovery(preview5)以及如何 ...
  • 一、工程簡介 MultiButton 是一個小巧簡單易用的事件驅動型按鍵驅動模塊。 Github地址:https://github.com/0x1abin/MultiButton 這個項目非常精簡,只有兩個文件: (1)可無限擴展按鍵; (2)按鍵事件的回調非同步處理方式可以簡化程式結構,去除冗餘的按 ...
  • 課程簡介 課程目標 理解操作系統的設計和實現 通過 XV6 操作系統動手實驗,可以擴展或改進操作系統 操作系統的目標 Abstraction:對硬體進行抽象 Multiplex:在多個應用程式之間共用硬體資源 Isolation:隔離性,程式出現故障時,不同程式之間不能相互干擾 Sharing:實現 ...
一周排行
    -Advertisement-
    Play Games
  • .Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 實測可以完整運行在 win7sp1/win10/win11. 如果用其他工具打包,還可以運行在mac/linux下, 傳送門BlazorHybrid 發佈為無依賴包方式 安裝 WebView2Runtime 1.57 M ...
  • 目錄前言PostgreSql安裝測試額外Nuget安裝Person.cs模擬運行Navicate連postgresql解決方案Garnet為什麼要選擇Garnet而不是RedisRedis不再開源Windows版的Redis是由微軟維護的Windows Redis版本老舊,後續可能不再更新Garne ...
  • C#TMS系統代碼-聯表報表學習 領導被裁了之後很快就有人上任了,幾乎是無縫銜接,很難讓我不想到這早就決定好了。我的職責沒有任何變化。感受下來這個系統封裝程度很高,我只要會調用方法就行。這個系統交付之後不會有太多問題,更多應該是做小需求,有大的開發任務應該也是第二期的事,嗯?怎麼感覺我變成運維了?而 ...
  • 我在隨筆《EAV模型(實體-屬性-值)的設計和低代碼的處理方案(1)》中介紹了一些基本的EAV模型設計知識和基於Winform場景下低代碼(或者說無代碼)的一些實現思路,在本篇隨筆中,我們來分析一下這種針對通用業務,且只需定義就能構建業務模塊存儲和界面的解決方案,其中的數據查詢處理的操作。 ...
  • 對某個遠程伺服器啟用和設置NTP服務(Windows系統) 打開註冊表 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer 將 Enabled 的值設置為 1,這將啟用NTP伺服器功 ...
  • title: Django信號與擴展:深入理解與實踐 date: 2024/5/15 22:40:52 updated: 2024/5/15 22:40:52 categories: 後端開發 tags: Django 信號 松耦合 觀察者 擴展 安全 性能 第一部分:Django信號基礎 Djan ...
  • 使用xadmin2遇到的問題&解決 環境配置: 使用的模塊版本: 關聯的包 Django 3.2.15 mysqlclient 2.2.4 xadmin 2.0.1 django-crispy-forms >= 1.6.0 django-import-export >= 0.5.1 django-r ...
  • 今天我打算整點兒不一樣的內容,通過之前學習的TransformerMap和LazyMap鏈,想搞點不一樣的,所以我關註了另外一條鏈DefaultedMap鏈,主要調用鏈為: 調用鏈詳細描述: ObjectInputStream.readObject() DefaultedMap.readObject ...
  • 後端應用級開發者該如何擁抱 AI GC?就是在這樣的一個大的浪潮下,我們的傳統的應用級開發者。我們該如何選擇職業或者是如何去快速轉型,跟上這樣的一個行業的一個浪潮? 0 AI金字塔模型 越往上它的整個難度就是職業機會也好,或者說是整個的這個運作也好,它的難度會越大,然後越往下機會就會越多,所以這是一 ...
  • @Autowired是Spring框架提供的註解,@Resource是Java EE 5規範提供的註解。 @Autowired預設按照類型自動裝配,而@Resource預設按照名稱自動裝配。 @Autowired支持@Qualifier註解來指定裝配哪一個具有相同類型的bean,而@Resourc... ...