Linux開機啟動管理---systemd使用
阿新 • • 發佈:2019-01-07
常用命令
使某服務自動啟動
systemctl enable httpd.service
使某服務不自動啟動
systemctl disable httpd.service
檢查服務狀態
systemctl status httpd.service (服務詳細資訊)
systemctl is-active httpd.service (僅顯示是否 Active)
顯示所有已啟動的服務
systemctl list-units --type=service
啟動某服務
systemctl start httpd.service
停止某服務
systemctl stop httpd.service
重啟某服務
systemctl restart httpd.service
修改配置檔案後重啟
修改配置檔案以後,需要重新載入配置檔案,然後重新啟動相關服務。
# 重新載入配置檔案
$ sudo systemctl daemon-reload
# 重啟相關服務
$ sudo systemctl restart foobar
開機服務管理
開機啟動unit
systemctl enable test.service
增加由/lib/systemd/system/到/etc/systemd/system/multi-user.target.wants/下的軟連結
ln -s '/usr/lib/systemd/system/postfix.service' '/etc/systemd/system/multi-user.target.wants/test.service'
一旦修改配置檔案,就要讓 SystemD 重新載入配置檔案,然後重新啟動,否則修改不會生效。
$ sudo systemctl daemon-reload
$ sudo systemctl restart httpd.service
開機不啟動unit
systemctl disable test.service
刪除/etc/systemd/system/multi-user.target .wants下的軟連結
檢視開機是否啟動
systemctl is-enabled test.service #查詢服務是否開機啟動
systemd檢視開機自啟動的程式
ls /etc/systemd/system/multi-user.target.wants/
檢視systemd單元載入及活動情況
systemctl
顯示啟動失敗的單元
systemctl --failed
檢視systemd管理的所有單元
systemctl list-unit-files
服務管理
啟動服務
systemctl start httpd.service
關閉服務
systemctl stop httpd.service
重啟服務
systemctl restart httpd.service
重新載入
systemctl reload httpd.service
檢視狀態
systemctl status httpd.service
包括啟動狀態、啟動時間、主程序及相關程序、相關日誌
systemctl
systemctl是 Systemd 的主命令,用於管理系統。
# 重啟系統
$ sudo systemctl reboot
# 關閉系統,切斷電源
$ sudo systemctl poweroff
# CPU停止工作
$ sudo systemctl halt
# 暫停系統
$ sudo systemctl suspend
# 讓系統進入冬眠狀態
$ sudo systemctl hibernate
# 讓系統進入互動式休眠狀態
$ sudo systemctl hybrid-sleep
# 啟動進入救援狀態(單使用者狀態)
$ sudo systemctl rescue
systemctl list-units命令可以檢視當前系統的所有 Unit 。
# 列出正在執行的 Unit
$ systemctl list-units
# 列出所有Unit,包括沒有找到配置檔案的或者啟動失敗的
$ systemctl list-units --all
# 列出所有沒有執行的 Unit
$ systemctl list-units --all --state=inactive
# 列出所有載入失敗的 Unit
$ systemctl list-units --failed
# 列出所有正在執行的、型別為 service 的 Unit
$ systemctl list-units --type=service
# 顯示某個 Unit 是否正在執行
$ systemctl is-active application.service
# 顯示某個 Unit 是否處於啟動失敗狀態
$ systemctl is-failed application.service
# 顯示某個 Unit 服務是否建立了啟動連結
$ systemctl is-enabled application.service
配置檔案的區塊
[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 執行必須滿足的條件,否則會報啟動失敗
!!!重要
eg:After=network.target sshd-keygen.service
After欄位:表示如果network.target或sshd-keygen.service需要啟動,那麼當前.service應該在它們之後啟動。
相應地,還有一個Before欄位,定義sshd.service應該在哪些服務之前啟動。
注意,After和Before欄位只涉及啟動順序,不涉及依賴關係。
[Install]通常是配置檔案的最後一個區塊,用來定義如何啟動,以及是否開機啟動。它的主要欄位如下。
WantedBy:它的值是一個或多個 Target,當前 Unit 啟用時(enable)符號連結會放入/etc/systemd/system目錄下面以 Target 名 + .wants字尾構成的子目錄中
RequiredBy:它的值是一個或多個 Target,當前 Unit 啟用時,符號連結會放入/etc/systemd/system目錄下面以 Target 名 + .required字尾構成的子目錄中
Alias:當前 Unit 可用於啟動的別名
Also:當前 Unit 啟用(enable)時,會被同時啟用的其他 Unit
[Service]區塊用來 Service 的配置,只有 Service 型別的 Unit 才有這個區塊。它的主要欄位如下。
Type:定義啟動時的程序行為。它有以下幾種值。
Type=simple:預設值,執行ExecStart指定的命令,啟動主程序
Type=forking:以 fork 方式從父程序建立子程序,建立後父程序會立即退出
Type=oneshot:一次性程序,Systemd 會等當前服務退出,再繼續往下執行
Type=dbus:當前服務通過D-Bus啟動
Type=notify:當前服務啟動完畢,會通知Systemd,再繼續往下執行
Type=idle:若有其他任務執行完畢,當前服務才會執行
ExecStart:啟動當前服務的命令
ExecStartPre:啟動當前服務之前執行的命令
ExecStartPost:啟動當前服務之後執行的命令
ExecReload:重啟當前服務時執行的命令
ExecStop:停止當前服務時執行的命令
ExecStopPost:停止當其服務之後執行的命令
RestartSec:自動重啟當前服務間隔的秒數
Restart:定義何種情況 Systemd 會自動重啟當前服務,可能的值包括always(總是重啟)、on-success、on-failure、on-abnormal、on-abort、on-watchdog
TimeoutSec:定義 Systemd 停止當前服務之前等待的秒數
Environment:指定環境變數
Unit 配置檔案的完整欄位清單,請參考官方文件。
日誌管理
Systemd 統一管理所有 Unit 的啟動日誌。帶來的好處就是,可以只用journalctl一個命令,檢視所有日誌(核心日誌和應用日誌)。日誌的配置檔案是/etc/systemd/journald.conf。
journalctl功能強大,用法非常多。
# 檢視所有日誌(預設情況下 ,只儲存本次啟動的日誌)
$ sudo journalctl
# 檢視核心日誌(不顯示應用日誌)
$ sudo journalctl -k
# 檢視系統本次啟動的日誌
$ sudo journalctl -b
$ sudo journalctl -b -0
# 檢視上一次啟動的日誌(需更改設定)
$ sudo journalctl -b -1
# 檢視指定時間的日誌
$ sudo journalctl --since="2012-10-30 18:17:16"
$ sudo journalctl --since "20 min ago"
$ sudo journalctl --since yesterday
$ sudo journalctl --since "2015-01-10" --until "2015-01-11 03:00"
$ sudo journalctl --since 09:00 --until "1 hour ago"
# 顯示尾部的最新10行日誌
$ sudo journalctl -n
# 顯示尾部指定行數的日誌
$ sudo journalctl -n 20
# 實時滾動顯示最新日誌
$ sudo journalctl -f
# 檢視指定服務的日誌
$ sudo journalctl /usr/lib/systemd/systemd
# 檢視指定程序的日誌
$ sudo journalctl _PID=1
# 檢視某個路徑的指令碼的日誌
$ sudo journalctl /usr/bin/bash
# 檢視指定使用者的日誌
$ sudo journalctl _UID=33 --since today
# 檢視某個 Unit 的日誌
$ sudo journalctl -u nginx.service
$ sudo journalctl -u nginx.service --since today
# 實時滾動顯示某個 Unit 的最新日誌
$ sudo 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
$ sudo journalctl -p err -b
# 日誌預設分頁輸出,--no-pager 改為正常的標準輸出
$ sudo journalctl --no-pager
# 以 JSON 格式(單行)輸出
$ sudo journalctl -b -u nginx.service -o json
# 以 JSON 格式(多行)輸出,可讀性更好
$ sudo journalctl -b -u nginx.serviceqq
-o json-pretty
# 顯示日誌佔據的硬碟空間
$ sudo journalctl --disk-usage
# 指定日誌檔案佔據的最大空間
$ sudo journalctl --vacuum-size=1G
# 指定日誌檔案儲存多久
$ sudo journalctl --vacuum-time=1years
Systemd 入門教程