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
  • GoF之工廠模式 @目錄GoF之工廠模式每博一文案1. 簡單說明“23種設計模式”1.2 介紹工廠模式的三種形態1.3 簡單工廠模式(靜態工廠模式)1.3.1 簡單工廠模式的優缺點:1.4 工廠方法模式1.4.1 工廠方法模式的優缺點:1.5 抽象工廠模式1.6 抽象工廠模式的優缺點:2. 總結:3 ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 本章將和大家分享ES的數據同步方案和ES集群相關知識。廢話不多說,下麵我們直接進入主題。 一、ES數據同步 1、數據同步問題 Elasticsearch中的酒店數據來自於mysql資料庫,因此mysql數據發生改變時,Elasticsearch也必須跟著改變,這個就是Elasticsearch與my ...
  • 引言 在我們之前的文章中介紹過使用Bogus生成模擬測試數據,今天來講解一下功能更加強大自動生成測試數據的工具的庫"AutoFixture"。 什麼是AutoFixture? AutoFixture 是一個針對 .NET 的開源庫,旨在最大程度地減少單元測試中的“安排(Arrange)”階段,以提高 ...
  • 經過前面幾個部分學習,相信學過的同學已經能夠掌握 .NET Emit 這種中間語言,並能使得它來編寫一些應用,以提高程式的性能。隨著 IL 指令篇的結束,本系列也已經接近尾聲,在這接近結束的最後,會提供幾個可供直接使用的示例,以供大伙分析或使用在項目中。 ...
  • 當從不同來源導入Excel數據時,可能存在重覆的記錄。為了確保數據的準確性,通常需要刪除這些重覆的行。手動查找並刪除可能會非常耗費時間,而通過編程腳本則可以實現在短時間內處理大量數據。本文將提供一個使用C# 快速查找並刪除Excel重覆項的免費解決方案。 以下是實現步驟: 1. 首先安裝免費.NET ...
  • C++ 異常處理 C++ 異常處理機制允許程式在運行時處理錯誤或意外情況。它提供了捕獲和處理錯誤的一種結構化方式,使程式更加健壯和可靠。 異常處理的基本概念: 異常: 程式在運行時發生的錯誤或意外情況。 拋出異常: 使用 throw 關鍵字將異常傳遞給調用堆棧。 捕獲異常: 使用 try-catch ...
  • 優秀且經驗豐富的Java開發人員的特征之一是對API的廣泛瞭解,包括JDK和第三方庫。 我花了很多時間來學習API,尤其是在閱讀了Effective Java 3rd Edition之後 ,Joshua Bloch建議在Java 3rd Edition中使用現有的API進行開發,而不是為常見的東西編 ...
  • 框架 · 使用laravel框架,原因:tp的框架路由和orm沒有laravel好用 · 使用強制路由,方便介面多時,分多版本,分文件夾等操作 介面 · 介面開發註意欄位類型,欄位是int,查詢成功失敗都要返回int(對接java等強類型語言方便) · 查詢介面用GET、其他用POST 代碼 · 所 ...
  • 正文 下午找企業的人去鎮上做貸後。 車上聽同事跟那個司機對罵,火星子都快出來了。司機跟那同事更熟一些,連我在內一共就三個人,同事那一手指桑罵槐給我都聽愣了。司機也是老社會人了,馬上聽出來了,為那個無辜的企業經辦人辯護,實際上是為自己辯護。 “這個事情你不能怪企業。”“但他們總不能讓銀行的人全權負責, ...