附註:

管理 Oracle Linux 的系統時間和排程作業

簡介

Oracle Linux 提供使用者數種與時間和日期互動的方式。雖然您可以手動變更這些規則,但是配置實行「網路時間協定 (NTP)」的服務 (例如同步 ) 更為常見。如此一來,您的系統時間仍然正確,而且任何使用 cronsystemd timers 的作業都會依排程執行。

目標

在本教學課程中,您將學習到:

必要條件

部署 Oracle Linux

注意:如果是在您自己的租用戶中執行,請先閱讀 linux-virt-labs GitHub 專案 README.md 並完成先決條件,再部署實驗環境環境。

  1. 在 Luna Desktop 上開啟終端機。

  2. 複製 linux-virt-labs GitHub 專案。

    git clone https://github.com/oracle-devrel/linux-virt-labs.git
    
  3. 變更至工作目錄。

    cd linux-virt-labs/ol
    
  4. 安裝必要的集合。

    ansible-galaxy collection install -r requirements.yml
    
  5. 部署實驗環境環境。

    ansible-playbook create_instance.yml -e localhost_python_interpreter="/usr/bin/python3.6"
    

    自由實驗環境環境需要額外的變數 local_python_interpreter,此變數會設定在 localhost 上執行的播放 ansible_python_interpreter。由於環境會安裝 Oracle Cloud Infrastructure SDK for Python 的 RPM 套件 (位於 python3.6 模組底下),因此需要此變數。

    預設部署資源配置使用 AMD CPU 和 Oracle Linux 8。若要使用 Intel CPU 或 Oracle Linux 9,請在部署命令中新增 -e instance_shape="VM.Standard3.Flex"-e os_version="9"

    重要事項: 請等待播放手冊順利執行,然後到達暫停工作。在手冊的這個階段,Oracle Linux 的安裝已完成,實例已就緒。記下先前的播放,此播放會列印其部署節點的公用和專用 IP 位址,以及執行實驗室時所需的任何其他部署資訊。

設定系統日期和時間

Oracle Linux 有三個常用指令,可協助您調整系統的日期與時間。date 指令可調整系統時間,而 hwclock 則可調整 RTC 時間。在 Oracle Linux 中,RTC 時間係指「即時時鐘 (RTC)」所保留的時間,這是一種電池供電的硬體時鐘,在系統電源關閉時繼續執行。硬體時鐘的其他常用名稱包括 CMOS 時鐘或 BIOS 時鐘。若要在 date 變更後更新 RTC 時鐘,您必須執行 hwclock

第三個選項為 timedatectl。這個指令結合 datehwclock,並在設定時間時同時更新系統和 RTC。在以 systemd 為基礎的現代化 Linux 扭曲 (例如 Oracle Linux) 上,建議您使用 timedatectl

顯示並設定系統時鐘 Name

  1. 開啟終端機,並透過 SSH 連線至 ol-node-01 執行處理。

    ssh oracle@<ip_address_of_instance>
    
  2. 取得目前的系統時間與日期。

    date
    

    輸出會以預設格式顯示系統的日期、時間和時區。您可以使用 date 指令的多個引數來變更輸出的格式。這些引數有助於編寫命令檔或計算不同的日期與時間。執行 date --help 以尋找更多資訊,或使用 man date 檢視手冊頁面。

  3. 調整系統時間和日期。

    sudo date -s "1 JAN 1970 16:00:00"
    
  4. 使用格式控制引數簡化格式。

    sudo date +%Y%m%d -s "20250203"
    

    請注意,由於您未提供時間,因此時間部分會預設為所有零,也就是午夜。

  5. 設定系統時間。

    sudo date +%T -s "14:08:14"
    

    如果您再次執行 date 命令,時間應該會根據您輸入的內容顯示。

顯示並設定硬體時鐘

  1. 讀取目前的硬體時鐘 (RTC)。

    sudo hwclock --show
    
  2. 根據硬體時鐘設定系統時鐘 。

    sudo hwclock -s
    

    此命令可讓您透過傳送 -w 函數,以相反方向設定時鐘。執行 hwclock --help 或檢視手冊頁面 man hwclock,即可查看其他功能和選項。

使用系統的日期與時間

  1. 取得目前日期和時間。

    timedatectl
    

    免費實驗環境環境中的輸出顯示 NTP 服務現用。若要使用 timedatectl 手動調整日期與時間設定值,必須先停用此設定。

  2. 停用 NTP 同步化。

    sudo timedatectl set-ntp no
    
  3. 設定日期和時間。

    sudo timedatectl set-time '2014-09-23 14:10:40'
    
  4. 請檢查日期與時間。

    date
    
  5. 取得時區清單。

    timedatectl list-timezones
    

    q 以結束 timedatectl 指令。

  6. 設定時區。

    sudo timedatectl set-timezone 'America/Chicago'
    
  7. 檢查新的時區。

    timedatectl
    
  8. 將時區傳回至世界標準時間 (UTC)。

    sudo timedatectl set-timezone 'UTC'
    
  9. 啟用 NTP 同步化。

    sudo timedatectl set-ntp yes
    

    經過一段時間後,會進行同步,且時鐘會根據時區集返回目前日期與時間。

使用 Chrony

chrony 是 Oracle Linux 的一項功能,實作 NTP 以在網路上準確地維護時間控制,而且包含 chronydchronyc 這兩個元件。chronyd 是一個服務常駐程式,可在開機時啟用及啟動,而 chronyc 是一個命令行公用程式,可用來監督 chronyd 的效能及修改其程式實際執行參數。

  1. 檢查是否已安裝 chrony

    dnf list chrony
    

    如果發現未安裝,可以使用 sudo dnf install -y chrony 來進行安裝。

  2. 檢查服務協助程式的狀態。

    sudo systemctl status chronyd
    

    如果服務為非作用中,請使用 sudo systemctl enable --now chronyd 來啟用及啟動服務。按 q 以結束 systemctl 指令。

  3. 取得系統時鐘效能的相關資訊。

    chronyc -n tracking
    

    輸出範例:

    Reference ID    : A9FEA9FE (169.254.169.254)
    Stratum         : 3
    Ref time (UTC)  : Mon Feb 03 16:07:59 2025
    System time     : 0.000009410 seconds slow of NTP time
    Last offset     : -0.000011537 seconds
    RMS offset      : 0.000015202 seconds
    Frequency       : 22.818 ppm slow
    Residual freq   : -0.004 ppm
    Skew            : 0.222 ppm
    Root delay      : 0.000643811 seconds
    Root dispersion : 0.000107666 seconds
    Update interval : 64.4 seconds
    Leap status     : Normal
    

    其中:

    • 參考 ID:這是電腦目前同步化之伺服器的參考 ID、名稱或 IP 位址。輸出中的參照 ID 會顯示為十六進位數字。
    • 分層:分層指示此系統遠離有多少躍點來自附有參考時鐘的電腦。
    • 參考時間:這是系統從參考來源處理上次測量時的 UTC 時間。

    使用 man chronyc 檢查手冊頁面,即可取得其他資訊。

  4. 取得系統使用的來源清單。

    chronyc -n sources
    

    使用 -v 選項會顯示每個顯示之資料欄的資料欄描述。

排定作業

Oracle Linux 包含數種排定作業的方式,這些作業或工作都可以在系統或使用者層次執行。雖然 cron 可能是這些方法中最有名的,但系統會在排程時引進更有彈性的計時器,讓日曆和單調時間變得更廣泛使用。目前的 Oracle Linux 配銷同時具有這兩種配銷。

使用 Cron

  1. 檢查系統層次 cron 工作。

    sudo ls -al /etc/cron*
    

    輸出提供數個目錄,其中包含可執行指令碼,這些可根據預先決定的排程執行選取任務,例如每小時、每週和每月。/etc/cron.d 目錄也存在,套裝軟體可以在不修改系統 /etc/crontab 的情況下放置 crontab 程式碼片段。

  2. 取得系統層次 cron 工作的清單。

    sudo crontab -l
    

    輸出指出根目錄沒有 crontab。在不使用 sudo 的情況下執行相同的指令可提供相同的輸出,但適用於本機使用者帳戶。

  3. 建立使用者層次 cron 工作。

    (crontab -l 2>/dev/null; echo  '* * * * * date >> /home/oracle/test') | crontab -
    

    第一個命令會避免使用 no crontab 訊息,因為這是第一個輸入的工作,而第二個命令會建立每分鐘執行的工作。

  4. 確認 crontab 已經存在。

    crontab -l
    

    每個工作都會顯示在 crontab 中的一行。crontab 有五個以空間分隔的欄位,分別定義您可以設定的不同期間,然後是工作將執行的指令。此指令可以等同於您可在系統指令行上執行的任何指令,讓您執行程序檔或利用管線和重新導向運算子。若要編輯工作,請使用 crontab -e 命令,此命令會將您放入 Oracle Linux 的預設 EDITOR vi

    Crontab 時間序列選項

    Crontab 會將時間欄位定義為:

    • 分鐘:從 0 到 59
    • 小時:從 0 到 23
    • 日:1~31
    • 月份:從 1 到 12,或月份的名稱
    • 星期幾:從 0 到 7,或日的縮寫名稱。請注意,0 和 7 都代表星期日。

    您可以在任何時間欄位內使用特殊字元:

    • 星號 (*):指定應該為欄位的每個例項執行指令。
    • 連字號 (-):可用於表示範圍。例如,在星期幾欄位中,您可以指定 1-5 來排定工作從星期一到星期五執行,但不要在星期六或星期日執行。
    • 逗號 (,):可用於指定欄位的值清單。例如,在小時欄位中,您可以指定 6,18 將工作排定在上午 6 點和下午 6 點執行。
    • 正斜線 (/):可用於指定級距值。例如,您可以在「分鐘」欄位中指定 */15,排定每 15 分鐘執行一次工作。

    crontab 也可讓您使用唯一的縮寫延伸來取代一般時間需求的時間欄位。重要的是,此速記也包含重新開機後執行指令的選項:

    • @reboot:重新開機後執行一次。
    • @yearly:每年執行一次,亦即 "0 0 1 1 *"。
    • @annually:每年執行一次,亦即 "0 0 1 1 *"。
    • @monthly:每月執行一次,亦即 "0 0 1 * *"。
    • @weekly:每週執行一次,亦即 "0 0 * * 0"。
    • @daily:每天執行一次,亦即 "0 0 * * * *"。
    • @hourly:每小時執行一次,亦即 "0 * * * * *"。

    crontab 只提供 1 分鐘的精細度。如果您的工作需要更精細的控制,建議您使用 systemd 計時器。

    範例:

    */15 * * * * echo "This crontab entry runs every 15 minutes"
    10 * * * * echo "This crontab entry runs at 10 minutes past every hour"
    30 13 * * 3 echo "This crontab entry runs at 13h30 on every Wednesday"
    @reboot echo "This command runs once after a reboot event"
    
  5. 檢查 cron 輸出。

    sudo tail /var/log/cron
    

    輸出顯示日期、時間、使用者和命令執行。由於 Oracle Linux 的預設最低安裝需求並未安裝「郵件傳輸代理程式 (MTA)」,因此 cron 協助程式會將 crontab 中指定的命令輸出導向「系統日誌」協助程式。因此,您可以在 /var/log/cron 的日誌檔中檢視 crontab 輸出。

    Crontab 命令語法

    crontab 是以 crontab 所屬使用者的證明資料執行,並以設定一些預設環境變數的方式執行,包括:

    • HOME:crontab 執行身分的使用者本位目錄
    • LOGNAME:等同於 crontab 執行身分之使用者的使用者名稱
    • 使用者:crontab 以下列方式執行的使用者名稱:
    • SHELL:系統用來執行命令的 SHELL 二進位檔。此值預設為 /bin/sh
    • PATH:crontab 公用程式可用的路徑。此值預設為 /usr/bin:/bin

    您可以將替代環境變數指定為 crontab 中不包含時間欄位的行,以設定替代環境變數。例如,如果您想要使用 bash Shell,而想要定期匯入您個人 .bashrc 組態中的所有變數和設定值,可以使用 crontab -e 編輯您的 crontab,如下所示:

    SHELL=/bin/bash
    * * * * * source $HOME/.bashrc;
    

    由於 crontab 工作的指令是在 Shell 環境中執行,因此會套用標準 Shell 語法,並可用於管路或重新導向輸出。例如,若要將所有輸出重新導向至 /dev/null,請在指令上使用 STDOUT 和 STDERR 輸出的標準 Shell 重新導向:

    * * * * * /path/to/command > /dev/null 2>&1
    

    另外,您也可以將輸出重新導向至附加的檔案,以便在每次執行指令時追蹤輸出:

    * * * * * /path/to/command >> $HOME/command.log
    

    範例:

    */15 * * * * echo "This 'silent' crontab entry runs every 15 minutes but the output is redirected to /dev/null" > /dev/null 2>&1
    * * * * * echo "The date and time is $(date +\%Y-\%m-\%d\ \%H:\%M:\%S)" >> $HOME/crontab.log
    

    此範例會遁離 date 命令中的 % 字元,因為 crontab 公用程式會將 % 字元變更為換行字元,而第一個 % 之後的所有資料都會當作標準輸入傳送至命令。如需詳細資訊,請參閱 man 5 crontab

移除 Crontab 檔案

如果您只打算移除特定的工作,可以使用 crontab -e 命令來編輯和移除包含該工作的個別行。不過,如果您要移除所有工作,crontab 會提供快速且有效率的選項。

  1. 移除您所有的 cron 工作項目 。

    crontab -r
    

系統計時器

就像 cron 工作一樣,系統計時器也允許在特定時間執行指令或程序檔。不過,這些工作由 systemd 控制和監督,而且可以更精細地控制以時間為基礎的啟動。

  1. 列出現有的計時器。

    systemctl status *timer
    

    q 以結束 systemctl 指令。

建立計時器

計時器由定義待辦事項的服務單位以及排程和觸發計時器單位所組成。由於這些是 systemd 服務單元,因此您可以在系統或使用者空間中建立它們。使用者空間的優點在於,它可以讓使用者管理其服務,例如協助程式和自動化作業。

  1. 建立本機使用者的 systemd 目錄。

    mkdir -p ~/.config/systemd/user
    

    系統層級的服務單元和計時器會進入 /etc/systemd/system

  2. 啟用目前使用者的 lingering。

    loginctl enable-linger $(whoami)
    

    Lingering 是指 systemd 中的功能,可讓使用者處理作業在使用者登出階段作業之後繼續執行。

  3. 驗證使用者的內衣狀態。

    loginctl user-status $(whoami)
    

    q 以結束 loginctl 命令。

  4. 撰寫計時器要執行的文稿 。

    cat << 'EOF' | tee ~/test.sh > /dev/null 
    #!/bin/bash
    /usr/bin/echo "test from test.service: $(date)" 2>&1 | tee -a /home/oracle/test.log
    EOF
    
  5. 建立命令檔執行檔。

    chmod +x ~/test.sh
    
  6. 建立服務單位。

    cat << EOF | tee ~/.config/systemd/user/test.service > /dev/null
    [Unit]
    Description=Run the test script
    StartLimitIntervalSec=1
    StartLimitBurst=10
       
    [Service]
    Type=oneshot
    ExecStart=/home/oracle/test.sh
    StandardOutput=journal
    SyslogIdentifier=test
    EOF
    

    此服務需要 StartLimitIntervalSecStartLimitBurst,因為它是打算每幾秒鐘執行此服務。您可以在 man systemd.unit 中進一步瞭解這些參數。

  7. 建立計時器單元。

    cat << EOF | tee ~/.config/systemd/user/test.timer > /dev/null
    [Unit]
    Description=Run test.service every 10 seconds
    
    [Timer]
    OnCalendar=*:*:0/10
    AccuracySec=1
    Persistent=true
    
    [Install]
    WantedBy=timers.target
    EOF
    

    需要 AccuracySec 參數,因為 systemd 計時器不會在要求時完全執行,而是以 1 分鐘的預設差異運作。

  8. 讓系統知道變更。

    systemctl --user daemon-reload
    
  9. 啟用並啟動計時器。

    systemctl --user enable --now test.timer
    
  10. 檢查計時器是否在執行中。

    systemctl --user status test.timer --no-pager
    

    --no-pager 選項會列印完整的輸出,而不需要捲動或逐頁瀏覽項目。查看 systemctl --help 以取得其他選項。

  11. 請檢查 bash 命令檔的日誌檔。

    cat ~/test.log
    
  12. 檢查 systemd 日記帳。

    journalctl -r -n 10 --user-unit test --no-pager
    

    此輸出顯示使用者 test.service systemd 單位的最後 10 行輸出。-r 選項會以相反的時間順序顯示日記帳分錄。

    journalctl -r -n 10 -t test --no-pager
    

    此命令顯示 systemd 服務單元執行命令檔所產生的輸出。-t 選項會比對 test.service 檔案中定義的 SyslogIdentifier (提供搜尋的 ID)。請參閱 man journalctl 頁面,瞭解 journalctl 的更多選項。

  13. 停用計時器。

    systemctl --user disable test.timer
    

    此指令可防止計時器於未來自動啟動,並使其失效。

  14. 停止計時器。

    systemctl --user stop test.timer
    

    如果計時器正在執行中,此指令會停止目前執行。它不會防止計時器在未來再次啟動。

接下來的步驟

完成本教學課程後,您將示範了在 Oracle Linux 上管理日期、時間和排程工作的技能和能力。顯示的指令有許多旗號和功能。請參閱以下連結和建議的線上手冊,以提升您的知識和技能。

其他學習資源

docs.oracle.com/learn 上探索其他實驗室,或在 Oracle Learning YouTube 頻道上存取更多免費學習內容。此外,請造訪 education.oracle.com/learning-explorer 以成為 Oracle Learning Explorer。

如需產品文件,請造訪 Oracle Help Center