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
  • 概述:本文代碼示例演示瞭如何在WPF中使用LiveCharts庫創建動態條形圖。通過創建數據模型、ViewModel和在XAML中使用`CartesianChart`控制項,你可以輕鬆實現圖表的數據綁定和動態更新。我將通過清晰的步驟指南包括詳細的中文註釋,幫助你快速理解並應用這一功能。 先上效果: 在 ...
  • openGauss(GaussDB ) openGauss是一款全面友好開放,攜手伙伴共同打造的企業級開源關係型資料庫。openGauss採用木蘭寬鬆許可證v2發行,提供面向多核架構的極致性能、全鏈路的業務、數據安全、基於AI的調優和高效運維的能力。openGauss深度融合華為在資料庫領域多年的研 ...
  • openGauss(GaussDB ) openGauss是一款全面友好開放,攜手伙伴共同打造的企業級開源關係型資料庫。openGauss採用木蘭寬鬆許可證v2發行,提供面向多核架構的極致性能、全鏈路的業務、數據安全、基於AI的調優和高效運維的能力。openGauss深度融合華為在資料庫領域多年的研 ...
  • 概述:本示例演示了在WPF應用程式中實現多語言支持的詳細步驟。通過資源字典和數據綁定,以及使用語言管理器類,應用程式能夠在運行時動態切換語言。這種方法使得多語言支持更加靈活,便於維護,同時提供清晰的代碼結構。 在WPF中實現多語言的一種常見方法是使用資源字典和數據綁定。以下是一個詳細的步驟和示例源代 ...
  • 描述(做一個簡單的記錄): 事件(event)的本質是一個委托;(聲明一個事件: public event TestDelegate eventTest;) 委托(delegate)可以理解為一個符合某種簽名的方法類型;比如:TestDelegate委托的返回數據類型為string,參數為 int和 ...
  • 1、AOT適合場景 Aot適合工具類型的項目使用,優點禁止反編 ,第一次啟動快,業務型項目或者反射多的項目不適合用AOT AOT更新記錄: 實實在在經過實踐的AOT ORM 5.1.4.117 +支持AOT 5.1.4.123 +支持CodeFirst和非同步方法 5.1.4.129-preview1 ...
  • 總說周知,UWP 是運行在沙盒裡面的,所有許可權都有嚴格限制,和沙盒外交互也需要特殊的通道,所以從根本杜絕了 UWP 毒瘤的存在。但是實際上 UWP 只是一個應用模型,本身是沒有什麼許可權管理的,許可權管理全靠 App Container 沙盒控制,如果我們脫離了這個沙盒,UWP 就會放飛自我了。那麼有沒... ...
  • 目錄條款17:讓介面容易被正確使用,不易被誤用(Make interfaces easy to use correctly and hard to use incorrectly)限制類型和值規定能做和不能做的事提供行為一致的介面條款19:設計class猶如設計type(Treat class de ...
  • title: 從零開始:Django項目的創建與配置指南 date: 2024/5/2 18:29:33 updated: 2024/5/2 18:29:33 categories: 後端開發 tags: Django WebDev Python ORM Security Deployment Op ...
  • 1、BOM對象 BOM:Broswer object model,即瀏覽器提供我們開發者在javascript用於操作瀏覽器的對象。 1.1、window對象 視窗方法 // BOM Browser object model 瀏覽器對象模型 // js中最大的一個對象.整個瀏覽器視窗出現的所有東西都 ...