詳解推薦使用systemd?timer替代cronjob
概述
前幾天在使用 Terraform + cloud-init 批量初始化我的實(shí)驗(yàn)室 Linux 機(jī)器。正好發(fā)現(xiàn)有一些定時(shí)場(chǎng)景需要使用到 cronjob, 進(jìn)一步了解到 systemd timer 完全可以替換 cronjob, 并且 systemd timer 有一些非常有趣的功能。
回歸話題:為什么我推薦你使用 systemd timer 替代 cronjob? 因?yàn)橄啾?cronjob, systemd timer 有這些優(yōu)勢(shì):
- 可以覆蓋 cronjob 的所有功能
- 統(tǒng)一日志收集到 systemd 日志
- 針對(duì)時(shí)間精確度更詳細(xì)的配置項(xiàng)
- 除了定時(shí)場(chǎng)景,還支持基于 event 的觸發(fā)
- 相比 cronjob 更靈活的語(yǔ)法
- 更豐富的使用/運(yùn)維命令集
接下來(lái)我們一一介紹。
首先我們通過系統(tǒng)自帶的 timer 來(lái)熟悉這個(gè)新玩意。
系統(tǒng)自帶的 timer
當(dāng) Ubuntu 或任何基于 systemd 的發(fā)行版安裝在一個(gè)新系統(tǒng)上時(shí),它會(huì)創(chuàng)建幾個(gè) timer,作為任何 Linux 主機(jī)后臺(tái)的系統(tǒng)維護(hù)程序的一部分。這些 timer 會(huì)觸發(fā)普通維護(hù)任務(wù)所需的事件,比如更新系統(tǒng)數(shù)據(jù)庫(kù)、清理臨時(shí)目錄、切割日志文件等等。
我們使用systemctl status *timer命令列出我的主機(jī)上的所有 timer:
casey@casey-Virtual-Machine:~$ systemctl status *timer ● plocate-updatedb.timer - Update the plocate database daily Loaded: loaded (/lib/systemd/system/plocate-updatedb.timer; enabled; vendor preset: enabled) Active: active (waiting) since Tue 2023-04-04 16:49:49 CST; 19s ago Trigger: Wed 2023-04-05 00:40:16 CST; 7h left Triggers: ● plocate-updatedb.service 4 月 04 16:49:49 casey-Virtual-Machine systemd[1]: Started Update the plocate database daily. ● fwupd-refresh.timer - Refresh fwupd metadata regularly Loaded: loaded (/lib/systemd/system/fwupd-refresh.timer; enabled; vendor preset: enabled) Active: active (waiting) since Tue 2023-04-04 16:49:49 CST; 19s ago Trigger: Wed 2023-04-05 01:54:51 CST; 9h left Triggers: ● fwupd-refresh.service 4 月 04 16:49:49 casey-Virtual-Machine systemd[1]: Started Refresh fwupd metadata regularly. ● update-notifier-motd.timer - Check to see whether there is a new version of Ubuntu available Loaded: loaded (/lib/systemd/system/update-notifier-motd.timer; enabled; vendor preset: enabled) Active: active (waiting) since Tue 2023-04-04 16:49:50 CST; 19s ago Trigger: Sat 2023-04-08 03:19:02 CST; 3 days left Triggers: ● update-notifier-motd.service 4 月 04 16:49:50 casey-Virtual-Machine systemd[1]: Started Check to see whether there is a new version of Ubuntu available. ● fstrim.timer - Discard unused blocks once a week Loaded: loaded (/lib/systemd/system/fstrim.timer; enabled; vendor preset: enabled) Active: active (waiting) since Tue 2023-04-04 16:49:49 CST; 19s ago Trigger: Tue 2023-04-04 17:58:23 CST; 1h 8min left Triggers: ● fstrim.service Docs: man:fstrim 4 月 04 16:49:49 casey-Virtual-Machine systemd[1]: Started Discard unused blocks once a week. ...
每個(gè) timer 至少有六行信息與之相關(guān):
- 第一行是 timer 的文件名和對(duì)其用途的簡(jiǎn)短描述。
- 第二行顯示 timer 的狀態(tài),它是否被加載,timer unit 文件的完整路徑,以及供應(yīng)商的預(yù)設(shè)。
- 第三行顯示其活動(dòng)狀態(tài),包括 timer 開始活動(dòng)的日期和時(shí)間。
- 第四行包含 timer 下次被觸發(fā)的日期和時(shí)間,以及直到觸發(fā)發(fā)生的大致時(shí)間。
- 第五行顯示由 timer 觸發(fā)的事件或服務(wù)的名稱。
- 一些(但不是全部)systemd unit 文件有指向相關(guān)文檔的指針。如上面的 Docs: man:fstrim
- 最后一行是 timer 所觸發(fā)的服務(wù)的最新實(shí)例的日志條目。
創(chuàng)建 timer
優(yōu)勢(shì)之一:統(tǒng)一日志收集到 systemd 日志
為了更快了解 timer, 我們創(chuàng)建自己的 service unit 和 timer unit 來(lái)觸發(fā)。
具體用途為:每周定期更新 tailscale 的版本。
首先,創(chuàng)建 tailscale update 服務(wù),如下:
[Unit] Description=Tailscale update Wants=tailscale-weekly-update.timer [Service] Type=oneshot ExecStart=/usr/bin/tailscale update -yes [Install] WantedBy=multi-user.target
然后,創(chuàng)建 tailscale update timer, 如下:
[Unit] Description=Tailscale update Requires=tailscale-weekly-update.service [Timer] Unit=tailscale-weekly-update.service OnCalendar=weekly [Install] WantedBy=timers.target
最后,啟用 timer:
systemctl enable tailscale-weekly-update.timer
這樣就可以了,但是為了演示,執(zhí)行:systemctl start tailscale-weekly-update.service 手動(dòng)運(yùn)行一次。
輸出會(huì)直接集成到 systemd 日志里,并可以通過 journalctl 查看:(包含手動(dòng)執(zhí)行日志,和后續(xù)自動(dòng)定期執(zhí)行的日志)
$ sudo journalctl -S "2023-03-29 00:00:00" -u tailscale-weekly-update.service 4 月 02 09:14:28 casey-Virtual-Machine systemd[1]: Starting Tailscale node agent... 4 月 02 09:14:30 casey-Virtual-Machine tailscale[6898]: 獲?。? https://pkgs.tailscale.com/stable/ubuntu jammy InRelease 4 月 02 09:14:30 casey-Virtual-Machine tailscale[6898]: 獲?。? https://pkgs.tailscale.com/stable/ubuntu jammy/main amd64 Packages [7,853 B] 4 月 02 09:14:32 casey-Virtual-Machine tailscale[6898]: 已下載 13.9 kB,耗時(shí) 1 秒 (14.4 kB/s) 4 月 02 09:14:32 casey-Virtual-Machine tailscale[6898]: 正在讀取軟件包列表。.. 4 月 02 09:14:33 casey-Virtual-Machine tailscale[7101]: 正在讀取軟件包列表。.. 4 月 02 09:14:33 casey-Virtual-Machine tailscale[7101]: 正在分析軟件包的依賴關(guān)系樹。.. 4 月 02 09:14:33 casey-Virtual-Machine tailscale[7101]: 正在讀取狀態(tài)信息。.. 4 月 02 09:14:33 casey-Virtual-Machine tailscale[7101]: 下列軟件包將被升級(jí): 4 月 02 09:14:33 casey-Virtual-Machine tailscale[7101]: tailscale 4 月 02 09:14:34 casey-Virtual-Machine tailscale[7101]: 升級(jí)了 1 個(gè)軟件包,新安裝了 0 個(gè)軟件包,要卸載 0 個(gè)軟件包,有 4 個(gè)軟件包未被升級(jí)。 4 月 02 09:14:34 casey-Virtual-Machine tailscale[7101]: 需要下載 23.0 MB 的歸檔。 4 月 02 09:14:34 casey-Virtual-Machine tailscale[7101]: 解壓縮后將會(huì)空出 1,024 B 的空間。 4 月 02 09:14:34 casey-Virtual-Machine tailscale[7101]: 獲取:1 https://pkgs.tailscale.com/stable/ubuntu jammy/main amd64 tailscale amd64 1.38.3 [23.0 MB] 4 月 02 09:15:13 casey-Virtual-Machine tailscale[7115]: debconf: 無(wú)法初始化前端界面:Dialog 4 月 02 09:15:13 casey-Virtual-Machine tailscale[7115]: debconf: (系統(tǒng)未設(shè)定 TERM 環(huán)境變量,所以對(duì)話框界面將不可使用。) 4 月 02 09:15:13 casey-Virtual-Machine tailscale[7115]: debconf: 返回前端界面:Readline 4 月 02 09:15:13 casey-Virtual-Machine tailscale[7115]: debconf: 無(wú)法初始化前端界面:Readline 4 月 02 09:15:13 casey-Virtual-Machine tailscale[7115]: debconf: (這個(gè)界面要求可控制的 tty。) 4 月 02 09:15:13 casey-Virtual-Machine tailscale[7115]: debconf: 返回前端界面:Teletype 4 月 02 09:15:13 casey-Virtual-Machine tailscale[7115]: dpkg-preconfigure: 重新開啟標(biāo)準(zhǔn)輸入失?。? 4 月 02 09:15:13 casey-Virtual-Machine tailscale[7101]: 已下載 23.0 MB,耗時(shí) 40 秒 (577 kB/s) 4 月 02 09:15:14 casey-Virtual-Machine tailscale[7101]: [729B blob data] 4 月 02 09:15:14 casey-Virtual-Machine tailscale[7101]: 準(zhǔn)備解壓 .../tailscale_1.38.3_amd64.deb ... 4 月 02 09:15:14 casey-Virtual-Machine tailscale[7101]: 正在解壓 tailscale (1.38.3) 并覆蓋 (1.38.2) ... 4 月 02 09:15:15 casey-Virtual-Machine tailscale[7101]: 正在設(shè)置 tailscale (1.38.3) ... 4 月 02 09:15:23 casey-Virtual-Machine tailscale[7325]: Running kernel seems to be up-to-date. 4 月 02 09:15:23 casey-Virtual-Machine tailscale[7325]: Services to be restarted: 4 月 02 09:15:23 casey-Virtual-Machine tailscale[7325]: systemctl restart tailscale-weekly-update.service 4 月 02 09:15:23 casey-Virtual-Machine tailscale[7325]: No containers need to be restarted. 4 月 02 09:15:23 casey-Virtual-Machine tailscale[7325]: No user sessions are running outdated binaries. 4 月 02 09:15:23 casey-Virtual-Machine tailscale[7325]: No VM guests are running outdated hypervisor (qemu) binaries on this host. 4 月 02 09:15:24 casey-Virtual-Machine systemd[1]: tailscale-weekly-update.service: Deactivated successfully. 4 月 02 09:15:24 casey-Virtual-Machine systemd[1]: Finished Tailscale node agent. 4 月 02 09:15:24 casey-Virtual-Machine systemd[1]: tailscale-weekly-update.service: Consumed 6.317s CPU time. $ sudo journalctl -S "2023-03-29 00:00:00" -u tailscale-weekly-update.timer 4 月 02 09:14:28 casey-Virtual-Machine systemd[1]: Started Tailscale node agent. 4 月 02 20:01:52 casey-Virtual-Machine systemd[1]: tailscale-weekly-update.timer: Deactivated successfully. 4 月 02 20:01:52 casey-Virtual-Machine systemd[1]: Stopped Tailscale node agent.
如上面的日志,可以很方便地檢查 timer 和服務(wù)的狀態(tài)。
在日志這方面,你不需要做任何特別的事情,就可以使tailscale-weekly-update.service unit 中的ExecStart觸發(fā)器的STDOUT存儲(chǔ)在日志中。這都是使用 systemd 運(yùn)行服務(wù)的一部分。
Systemd timer 時(shí)間精度
優(yōu)勢(shì)之一:針對(duì)時(shí)間精確度更詳細(xì)的配置項(xiàng)
從上面日志,如果細(xì)看,timer 不會(huì)在:00秒的時(shí)候準(zhǔn)確觸發(fā),甚至不會(huì)在上一個(gè)實(shí)例的一分鐘內(nèi)準(zhǔn)確觸發(fā)。這是故意的,但如果有必要的話,可以覆蓋它的默認(rèn)配置。
這種行為的原因是為了防止多個(gè)服務(wù)在完全相同的時(shí)間被觸發(fā)。例如,你可以使用時(shí)間規(guī)格,如每周、每天,等等。這些快捷方式都被定義為在它們被觸發(fā)的那一天的 00:00:00 時(shí)觸發(fā)。當(dāng)多個(gè) timer 被這樣指定時(shí),它們很有可能會(huì)試圖同時(shí)啟動(dòng)。
systemd timer 被有意設(shè)計(jì)成在指定時(shí)間內(nèi)隨機(jī)觸發(fā),以防止同時(shí)觸發(fā)。它們?cè)谝粋€(gè)時(shí)間窗口內(nèi)半隨機(jī)地觸發(fā)。根據(jù)systemd.timer手冊(cè),這個(gè)觸發(fā)時(shí)間相對(duì)于所有其他定義的 timer 單位來(lái)說(shuō),保持在一個(gè)穩(wěn)定的位置。
大多數(shù)時(shí)候,這種概率性的觸發(fā)時(shí)間是沒有問題的。當(dāng)安排備份等任務(wù)運(yùn)行時(shí),只要它們?cè)诜枪ぷ鲿r(shí)間運(yùn)行,就不會(huì)有問題。一個(gè)系統(tǒng)管理員可以選擇一個(gè)確定的開始時(shí)間,如典型的 cronjob 規(guī)范中的 01:05:00,以不與其他任務(wù)沖突,但有很大范圍的時(shí)間值可以達(dá)到這個(gè)目的。啟動(dòng)時(shí)間中的一分鐘隨機(jī)性通常是不相關(guān)的。
然而,對(duì)于某些任務(wù),精確的觸發(fā)時(shí)間是一個(gè)絕對(duì)要求。對(duì)于這些任務(wù),你可以通過在 timer unit 文件的 Timer 部分添加這樣的配置來(lái)指定更高的觸發(fā)時(shí)間跨度精度(如精度在一微秒內(nèi)):
AccuracySec=1us
時(shí)間跨度可用于指定所需的精度,以及為重復(fù)性或一次性事件定義時(shí)間跨度。它可以識(shí)別以下單位:
- usec, us, µs
- msec, ms
- seconds, second, sec, s
- minutes, minute, min, m
- hours, hour, hr, h
- days, day, d
- weeks, week, w
- months, month, M (定義為 30.44 天)
- years, year, y (定義為 365.25 天)
/usr/lib/systemd/system中的所有默認(rèn) timer 都指定了一個(gè)更大的精度范圍,因?yàn)榫_的時(shí)間并不關(guān)鍵??纯聪到y(tǒng)創(chuàng)建的 timer 中的一些規(guī)格:
$ grep Accur /usr/lib/systemd/system/*timer /usr/lib/systemd/system/fstrim.timer:AccuracySec=1h /usr/lib/systemd/system/logrotate.timer:AccuracySec=1h /usr/lib/systemd/system/plocate-updatedb.timer:AccuracySec=20min /usr/lib/systemd/system/snapd.snap-repair.timer:AccuracySec=10min
Timer 類型
優(yōu)勢(shì)之一:除了定時(shí)場(chǎng)景,還支持基于 event 的觸發(fā)
systemd timer 具有 cron 所不具備的其他功能,cron 只在特定的、重復(fù)的、實(shí)時(shí)的日期和時(shí)間觸發(fā)。但是,一個(gè) timer 可以被配置為在系統(tǒng)啟動(dòng)后,或在啟動(dòng)后,或在某個(gè)定義的服務(wù) unit 激活后的特定時(shí)間內(nèi)觸發(fā)。這些被稱為單調(diào)性 timer。單調(diào)指的是一個(gè)持續(xù)增加的計(jì)數(shù)或序列。這些 timer 不是持久的,因?yàn)樗鼈冊(cè)诿看螁?dòng)后都會(huì)重置。
表 1 列出了單調(diào)的 timer 以及每個(gè) timer 的簡(jiǎn)短定義,還有 "OnCalendar" timer,它不是單調(diào)的,用于指定未來(lái)的時(shí)間,可能是重復(fù)的,也可能不是。
Timer | 單調(diào)性 | 定義 |
---|---|---|
OnActiveSec= | X | 這定義了一個(gè)相對(duì)于 timer 被激活的時(shí)刻的 timer。 |
OnBootSec= | X | 這定義了一個(gè)相對(duì)于機(jī)器啟動(dòng)時(shí)間的 timer。 |
OnStartupSec= | X | 這定義了一個(gè)相對(duì)于服務(wù)管理器首次啟動(dòng)時(shí)間的計(jì)時(shí)器。對(duì)于系統(tǒng) timer unit,這與OnBootSec=非常相似,因?yàn)橄到y(tǒng)服務(wù)管理器通常在啟動(dòng)時(shí)很早就啟動(dòng)。當(dāng)配置在每個(gè)用戶服務(wù)管理器中運(yùn)行的單元時(shí),它主要是有用的,因?yàn)橛脩舴?wù)管理器一般只在第一次登錄時(shí)啟動(dòng),而不是在啟動(dòng)時(shí)。 |
OnUnitActiveSec= | X | 這定義了一個(gè)相對(duì)于要激活的 timer 最后一次被激活的時(shí)間。 |
OnUnitInactiveSec= | X | 這定義了一個(gè)相對(duì)于要激活的 timer 最后被停用的時(shí)間的定時(shí)器。 |
OnCalendar= | 這就用日歷事件表達(dá)式定義了實(shí)時(shí) timer。更多關(guān)于日歷事件表達(dá)式的語(yǔ)法信息請(qǐng)參見systemd.time(7)。否則,其語(yǔ)義與OnActiveSec=及相關(guān)設(shè)置類似。這個(gè) timer 是最像那些與 cron 服務(wù)一起使用的 timer。 |
表 1: systemd timer 定義
單調(diào) timer 的時(shí)間跨度可以使用與前面提到的AccuracySec語(yǔ)句相同的快捷名稱,但 systemd 將這些名稱規(guī)范化為秒。例如,你可能想指定一個(gè) timer,在系統(tǒng)啟動(dòng) 5 天后觸發(fā)一次事件,可以這樣寫: OnBootSec=5d。如果主機(jī)在2020-06-15 09:45:27啟動(dòng),timer 將在2020-06-20 09:45:27或之后一分鐘內(nèi)觸發(fā)。
Calendar event 定義
優(yōu)勢(shì)之一:相比 cronjob 更靈活的語(yǔ)法
Calendar event 定義是在所需的重復(fù)時(shí)間觸發(fā) timer 的關(guān)鍵部分。首先看一下OnCalendar設(shè)置中使用的一些規(guī)格。
systemd 及其 timer 使用的時(shí)間和日期規(guī)格與 crontab 中使用的格式不同。它比 crontab 更靈活,允許以at命令的方式模糊日期和時(shí)間。
使用OnCalendar=的 systemdtimer 的基本格式是DOW YYYY-MM-DD HH:MM:SS。DOW(星期)是可選的,其他字段可以使用星號(hào)(*)來(lái)匹配該位置的任何值。所有日歷時(shí)間形式都被轉(zhuǎn)換為規(guī)范化的形式。如果沒有指定時(shí)間,則假定其為 00:00:00。如果沒有指定日期但指定了時(shí)間,那么下一個(gè)匹配可能是今天或明天,這取決于當(dāng)前的時(shí)間。名稱或數(shù)字可用于月份和星期??梢灾付總€(gè)單位的逗號(hào)分隔的列表。單位范圍可以在開始和結(jié)束值之間用...來(lái)指定。
有幾個(gè)有趣的選項(xiàng)用于指定日期。波浪號(hào)(~)可以用來(lái)指定該月的最后一天或該月最后一天之前的指定天數(shù)。"/"可以用來(lái)指定一周中的某一天作為修飾語(yǔ)。
下面是一些在OnCalendar語(yǔ)句中使用的典型時(shí)間規(guī)格的例子:
Calendar event 定義 | 描述 |
---|---|
DOW YYYY-MM-DD HH:MM:SS | |
*-*-* 00:15:30 | 每年的每個(gè)月的每一天,在午夜后的 15 分鐘 30 秒。 |
Weekly | 每個(gè)星期一的 00:00:00 |
Mon *-*-* 00:00:00 | 與每周相同 |
Mon | 與每周相同 |
Wed 2020-*-* | 2020 年的每個(gè)星期三,00:00:00 |
Mon..Fri 2021-*-* | 2021 年的每個(gè)工作日的 00:00:00 |
2023-6,7,8-1,15 01:15:00 | 2023 年 6 月、7 月和 8 月的 1 日和 15 日凌晨 01:15:00 |
Mon *-05~03 | 任何一年的 5 月的下一個(gè)星期一,也是月末的第三天。 |
Mon..Fri *-08~04 | 任何年份的 8 月底前的第 4 天,如果該天也是工作日,則為 8 月底。 |
*-05~03/2 | 從五月底開始的第三天,兩天后再來(lái)一次。每年都會(huì)重復(fù)。請(qǐng)注意,這個(gè)表達(dá)式使用了(~)。 |
*-05-03/2 | 五月的第三天,然后在五月的其余時(shí)間里每隔一天。每年重復(fù)一次。注意,這個(gè)表達(dá)式使用了破折號(hào)(-)。 |
表 2: 示例OnCalendar event 定義
測(cè)試 calendar 定義
優(yōu)勢(shì)之一:更豐富的使用/運(yùn)維命令集
systemd 提供了一個(gè)很好的工具來(lái)驗(yàn)證和檢查 timer 中的日歷時(shí)間事件規(guī)范。systemd-analyze calendar工具解析了一個(gè)日歷時(shí)間事件規(guī)范,并提供了規(guī)范化的形式以及其他有趣的信息,比如下一個(gè) "elapse"(即匹配)的日期和時(shí)間,以及達(dá)到觸發(fā)時(shí)間前的大致時(shí)間。
首先,看一下未來(lái)的一個(gè)沒有時(shí)間的日期:
$ systemd-analyze calendar 2030-06-17 Original form: 2030-06-17 Normalized form: 2030-06-17 00:00:00 Next elapse: Mon 2030-06-17 00:00:00 CST (in UTC): Sun 2030-06-16 16:00:00 UTC From now: 7 years 2 months left
現(xiàn)在添加一個(gè)時(shí)間。在這個(gè)例子中,日期和時(shí)間作為非相關(guān)實(shí)體被單獨(dú)分析:
$ systemd-analyze calendar 2030-06-17 15:21:16 Original form: 2030-06-17 Normalized form: 2030-06-17 00:00:00 Next elapse: Mon 2030-06-17 00:00:00 CST (in UTC): Sun 2030-06-16 16:00:00 UTC From now: 7 years 2 months left Original form: 15:21:16 Normalized form: *-*-* 15:21:16 Next elapse: Wed 2023-04-05 15:21:16 CST (in UTC): Wed 2023-04-05 07:21:16 UTC From now: 21h left
要把日期和時(shí)間作為一個(gè) unit 來(lái)分析,需要用引號(hào)把它們括起來(lái)。
$ systemd-analyze calendar "2030-06-17 15:21:16" Normalized form: 2030-06-17 15:21:16 Next elapse: Mon 2030-06-17 15:21:16 CST (in UTC): Mon 2030-06-17 07:21:16 UTC From now: 7 years 2 months left
現(xiàn)在測(cè)試表 2 中的條目。選一個(gè)復(fù)雜的:
$ systemd-analyze calendar "2023-6,7,8-1,15 01:15:00" Original form: 2023-6,7,8-1,15 01:15:00 Normalized form: 2023-06,07,08-01,15 01:15:00 Next elapse: Thu 2023-06-01 01:15:00 CST (in UTC): Wed 2023-05-31 17:15:00 UTC From now: 1 month 26 days left
讓我們看一個(gè)例子,在這個(gè)例子中,我們列出了時(shí)間戳表達(dá)式的下五個(gè)執(zhí)行時(shí)間:
$ systemd-analyze calendar --iterations=5 "Mon *-05~3" Original form: Mon *-05~3 Normalized form: Mon *-05~03 00:00:00 Next elapse: Mon 2023-05-29 00:00:00 CST (in UTC): Sun 2023-05-28 16:00:00 UTC From now: 1 month 23 days left Iter. #2: Mon 2028-05-29 00:00:00 CST (in UTC): Sun 2028-05-28 16:00:00 UTC From now: 5 years 1 month left Iter. #3: Mon 2034-05-29 00:00:00 CST (in UTC): Sun 2034-05-28 16:00:00 UTC From now: 11 years 1 month left Iter. #4: Mon 2045-05-29 00:00:00 CST (in UTC): Sun 2045-05-28 16:00:00 UTC From now: 22 years 1 month left Iter. #5: Mon 2051-05-29 00:00:00 CST (in UTC): Sun 2051-05-28 16:00:00 UTC From now: 28 years 1 month left
這應(yīng)該給你足夠的信息來(lái)開始測(cè)試你的OnCalendar時(shí)間規(guī)格。
總結(jié)
systemd timer 可以用來(lái)執(zhí)行與 cron 工具相同類型的任務(wù),但在觸發(fā)事件的 calendar 和單調(diào)的時(shí)間規(guī)格方面提供了更多的靈活性。
除此之外,systemd timer 還有的優(yōu)勢(shì)包括:
- 統(tǒng)一日志收集到 systemd 日志
- 針對(duì)時(shí)間精確度更詳細(xì)的配置項(xiàng)
- 更豐富的使用/運(yùn)維命令集
快去嘗試遷移你的 cronjob 到 systemd timer 吧~??????
參考資料
- Use systemd timers instead of cronjobs
- Fedora 的 systemd 指南
- Fedora 的 systemd cheat sheet
以上就是推薦使用systemd timer替代0cronjob的詳細(xì)內(nèi)容,更多關(guān)于systemd timer替代cronjob的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
kubernetes需要默認(rèn)的serviceaccount的原因解析
這篇文章主要介紹了kubernetes為何需要默認(rèn)的serviceaccount,ServiceAccount 是 Kubernetes 中的一種重要概念,它的實(shí)際使用場(chǎng)景包括很多,本文給大家講解的非常詳細(xì),需要的朋友可以參考下2023-04-04詳解Rainbond云原生平臺(tái)簡(jiǎn)化Kubernetes業(yè)務(wù)問題排查
這篇文章主要介紹了詳解Rainbond云原生平臺(tái)簡(jiǎn)化Kubernetes業(yè)務(wù)問題排查,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03解決k8s namespace 一直處于 Terminating 狀態(tài)的問題
這篇文章主要介紹了k8s namespace 一直處于 Terminating 狀態(tài)的解決方法,以下的 tool 為 Terminating 狀態(tài)的 namespace,下面相關(guān)的一些操作記得將 tool 修改成自己的 namespace 名稱,需要的朋友可以參考下2022-10-10云原生技術(shù)kubernetes(K8S)簡(jiǎn)介
這篇文章主要介紹了云原生技術(shù)kubernetes的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用K8S,感興趣的朋友可以了解下2021-03-03Rainbond部署組件Statefulset的使用官方文檔
這篇文章主要為大家介紹了官方文檔Rainbond部署組件Statefulset的使用,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-04-04k8s整合istio配置gateway入口、配置集群內(nèi)部服務(wù)調(diào)用管理(最新推薦)
這篇文章主要介紹了k8s整合istio配置gateway入口、配置集群內(nèi)部服務(wù)調(diào)用管理,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-08-08Rainbond功能架構(gòu)及應(yīng)用管理官方文檔介紹
這篇文章主要為大家介紹了Rainbond功能機(jī)構(gòu)及使用官方文檔,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-04-04