1. 程式人生 > >linux系統服務和應用服務管理工具——systemctl

linux系統服務和應用服務管理工具——systemctl

1. systemctl常用命令

1.1 服務管理

  • 啟動服務
# systemctl start httpd.service
  • 關閉服務
# systemctl stop httpd.service
  • 重啟服務
# systemctl restart httpd.service
  • 重新載入
# systemctl reload httpd.service
  • 檢視狀態
# systemctl status httpd.service
  • systemctl list-units相關
// 列出所有正在執行的、型別為service的Unit
# systemctl list-units --type=service 
// 列出正在執行的Unit # systemctl list-units // 列出所有Unit,包括沒有找到配置檔案的或者啟動失敗的服務 # systemctl list-units --all // 檢視systemd管理的所有單元 # systemctl list-unit-files // 列出所有載入失敗的Unit # systemctl list-units --failed // 列出所有沒有執行的Unit # systemctl list-units --all --state=inactive // 顯示某個 Unit 是否正在執行 # systemctl is-active application.service
// 顯示某個 Unit 是否處於啟動失敗狀態 # systemctl is-failed application.service // 顯示某個 Unit 服務是否建立了啟動連結 # systemctl is-enabled application.service
  • 使某服務開機自啟動
# systemctl enable httpd.service

這個操作會增加由/lib/systemd/system/到/etc/systemd/system/multi-user.target.wants/下的軟連結ln -s '/usr/lib/systemd/system/httpd.service' '/etc/systemd/system/multi-user.target.wants/httpd.service'

  • 禁用某服務開機自啟動
# systemctl disable httpd.service

這個操作會刪除/etc/systemd/system/multi-user.target.wants下的軟連結

  • 檢視開機是否啟動
# systemctl is-enabled httpd.service
  • 顯示啟動失敗的單元
# systemctl --failed
  • 檢視systemd單元載入及活動情況
# systemctl
  • 檢視systemd開機自啟動的程式
# ls /etc/systemd/system/multi-user.target.wants/

1.2 修改.service配置檔案

修改配置檔案以後,需要重新載入配置檔案,然後重新啟動相關服務。

// 修改配置檔案
# vim /usr/lib/systemd/system/httpd.service

// 重新載入配置檔案
# systemctl daemon-reload

// 重啟相關服務
# systemctl restart httpd.service

一旦修改了配置檔案,就要讓Systemd重新載入配置檔案,然後重新啟動,否則修改不會生效。

1.3 系統管理

  • 重啟系統
# systemctl reboot
  • 關閉系統,切斷電源
# systemctl poweroff
  • CPU停止工作
# systemctl halt
  • 暫停系統
# systemctl suspend
  • 讓系統進入冬眠狀態
# systemctl hibernate
  • 讓系統進入互動式休眠狀態
# systemctl hybrid-sleep
  • 啟動進入救援狀態(單使用者狀態)
# systemctl rescue

2. .service配置檔案的區塊

2.1 [Unit]區塊

[Unit]區塊通常是配置檔案的第一個區塊,用來定義 Unit 的元資料,以及配置與其他 Unit 的關係。它的主要欄位如下:

  • Description:簡短描述
  • Documentation:文件地址
  • Requires:當前Unit依賴的其他Unit,如果它們沒有執行,當前Unit會啟動失敗
  • Wants:與當前Unit配合的其他Unit,如果它們沒有執行,當前Unit不會啟動失敗
  • BindsTo:與Requires類似,它指定的Unit如果退出,會導致當前Unit停止執行
  • Before:如果該欄位指定的Unit也要啟動,那麼必須在當前Unit之後啟動
  • After:如果該欄位指定的Unit也要啟動,那麼必須在當前Unit之前啟動
  • Conflicts:這裡指定的Unit不能與當前Unit同時執行
  • Condition:當前Unit執行必須滿足的條件,否則不會執行
  • Assert:當前Unit執行必須滿足的條件,否則會報啟動失敗

例如

After=network.target sshd-keygen.service

上述表示如果network.target或sshd-keygen.service需要啟動,那麼當前.service應該在它們之後啟動。相應地,還有一個Before欄位,定義sshd.service應該在哪些服務之前啟動。
注意,After和Before欄位只涉及啟動順序,不涉及依賴關係。

2.2 [Install]區塊

[Install]通常是配置檔案的最後一個區塊,用來定義如何啟動,以及是否開機啟動。它的主要欄位如下:

  • WantedBy:它的值是一個或多個Target,當前 Unit 啟用時(enable)符號連結會放入/etc/systemd/system目錄下面以Target名 + .wants字尾構成的子目錄中
  • RequiredBy:它的值是一個或多個Target,當前 Unit 啟用時,符號連結會放入/etc/systemd/system目錄下面以Target名 + .required字尾構成的子目錄中
  • Alias:當前Unit可用於啟動的別名
  • Also:當前Unit啟用(enable)時,會被同時啟用的其他Unit

2.3 [Service]區塊

[Service]區塊用來 Service 的配置,只有 Service 型別的 Unit 才有這個區塊。它的主要欄位如下:

  • Type:定義啟動時的程序行為。它有以下幾種值:
    simple,預設值,執行ExecStart指定的命令,啟動主程序
    forking,以fork方式從父程序建立子程序,建立後父程序會立即退出
    oneshot,一次性程序,Systemd會等當前服務退出,再繼續往下執行
    dbus,當前服務通過D-Bus啟動
    notify,當前服務啟動完畢,會通知Systemd,再繼續往下執行
    idle,若有其他任務執行完畢,當前服務才會執行
  • ExecStart:啟動當前服務的命令
  • ExecStartPre:啟動當前服務之前執行的命令
  • ExecStartPost:啟動當前服務之後執行的命令
  • ExecReload:重啟當前服務時執行的命令
  • ExecStop:停止當前服務時執行的命令
  • ExecStopPost:停止當其服務之後執行的命令
  • RestartSec:自動重啟當前服務間隔的秒數
  • Restart:定義何種情況Systemd會自動重啟當前服務,可能的值包括always(總是重啟)、on-success、on-failure、on-abnormal、on-abort、on-watchdog
  • TimeoutSec:定義Systemd停止當前服務之前等待的秒數
  • Environment:指定環境變數

3. 日誌管理

Systemd 統一管理所有 Unit 的啟動日誌。帶來的好處就是,可以只用journalctl一個命令,檢視所有日誌(核心日誌和應用日誌)。日誌的配置檔案是/etc/systemd/journald.conf。journalctl功能強大,用法非常多。

// 檢視所有日誌(預設情況下 ,只儲存本次啟動的日誌)
# journalctl

// 檢視核心日誌(不顯示應用日誌)
# journalctl -k

// 檢視系統本次啟動的日誌
# journalctl -b
# journalctl -b -0

// 檢視上一次啟動的日誌(需更改設定)
# journalctl -b -1

// 檢視指定時間的日誌
# journalctl --since="2012-10-30 18:17:16"
# journalctl --since "20 min ago"
# journalctl --since yesterday
# journalctl --since "2015-01-10" --until "2015-01-11 03:00"
# journalctl --since 09:00 --until "1 hour ago"

// 顯示尾部的最新10行日誌
# journalctl -n

// 顯示尾部指定行數的日誌
# journalctl -n 20

// 實時滾動顯示最新日誌
# journalctl -f

// 檢視指定服務的日誌
# journalctl /usr/lib/systemd/systemd

// 檢視指定程序的日誌
# journalctl _PID=1

// 檢視某個路徑的指令碼的日誌
# journalctl /usr/bin/bash

// 檢視指定使用者的日誌
# journalctl _UID=33 --since today

// 檢視某個 Unit 的日誌
# journalctl -u nginx.service
# journalctl -u nginx.service --since today

// 實時滾動顯示某個 Unit 的最新日誌
# journalctl -u nginx.service -f

// 合併顯示多個 Unit 的日誌
# journalctl -u nginx.service -u php-fpm.service --since today

// 檢視指定優先順序(及其以上級別)的日誌,共有8級
# 0: emerg
# 1: alert
# 2: crit
# 3: err
# 4: warning
# 5: notice
# 6: info
# 7: debug
# journalctl -p err -b

// 日誌預設分頁輸出,--no-pager改為正常的標準輸出
# journalctl --no-pager

// 以 JSON 格式(單行)輸出
# journalctl -b -u nginx.service -o json

// 以JSON格式(多行)輸出,可讀性更好
# journalctl -b -u nginx.serviceqq -o json-pretty

// 顯示日誌佔據的硬碟空間
# journalctl --disk-usage

// 指定日誌檔案佔據的最大空間
# journalctl --vacuum-size=1G

// 指定日誌檔案儲存多久
# journalctl --vacuum-time=1years

4. 參考文章