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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...