[Conda&pip] 換清華源、匯出/恢復虛擬環境
轉: https://zhuanlan.zhihu.com/p/29217941
一、Systemd 簡介
以下我把可以管理系統所有程序、服務以及啟動項等的軟體簡稱「系統管理器」。
在 CentOS 7 之前,系統以 System V 來作為系統管理器。
System V 有一個致命的缺點就是過度依賴於指令碼來實現服務管理,從而導致服務幾乎沒辦法並行啟動,最終導致系統啟動效率較為低下。
從 CentOS 7 開始,Systemd 成為新的系統管理器。我認為它最大的優點就是支援進服務並行啟動,從而使效率大大提高;同時它還具有日誌管理、快照備份與恢復、掛載點管理等多種實用功能,功能甩 System V 幾條街!
而且 systemd
程序的 PID 是 1 ,也就是說 Systemd 掌管著一切程序!
當然了 Systemd 是向下相容 System V 的。
以下只介紹 Systemd 的服務、啟動項和日誌管理這三項功能,其他功能不涉及。
說明
1. 下文提到的服務項名稱後面的.service
可以省略不寫,系統會自動補全。
2. Systemd 不僅僅管理系統的服務項,還能管理著掛載點、套接字等。每一個 Systemd 管理項稱為unit
,unit
可以有很多型別。本文僅介紹.service
型別和.target
的 unit 。
3. 本文適用於所有使用 Systemd 的作業系統,不侷限於 CentOS 7。
二、服務、系統狀態的檢視
2.1 檢視系統所有安裝的服務項
systemctl list-unit-files --type=service
使用 PageUp
或 PageDown
翻頁,檢視完畢後按 q
退出。
2.2 檢視系統所有執行的服務項
systemctl list-units --type=service
如果看到某個服務項前面有一個紅點,說明該服務存在問題,請進行排查。
使用 PageUp
或 PageDown
翻頁,檢視完畢後按 q
退出。
2.3 檢視系統所有開機自啟動的服務項
systemctl list-unit-files --type=service | grep enabled
2.4 檢視指定服務項狀態
systemctl status <服務項名稱>
執行命令之後,系統會顯示該服務項的狀態、是否已啟用、描述以及最後十條日誌。
如果服務項前面有一個紅點,說明該服務存在問題,請根據日誌進行排查。
例如
檢視 Nginx 服務狀態
[root: ~]# systemctl status nginx.service
● nginx.service - nginx - high performance web server
Loaded: loaded (/usr/lib/systemd/system/nginx.service; disabled; vendor preset: disabled)
Active: inactive (dead)
Docs: http://nginx.org/en/docs/
9月 05 09:24:07 CentOS_VM systemd[1]: nginx.service: control process exited, code=exited status=1
9月 05 09:24:07 CentOS_VM systemd[1]: Failed to start nginx - high performance web server.
9月 05 09:24:07 CentOS_VM systemd[1]: Unit nginx.service entered failed state.
9月 05 09:24:07 CentOS_VM systemd[1]: nginx.service failed.
9月 05 09:28:39 CentOS_VM systemd[1]: Starting nginx - high performance web server...
9月 05 09:28:39 CentOS_VM nginx[5566]: nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
9月 05 09:28:39 CentOS_VM nginx[5566]: nginx: configuration file /etc/nginx/nginx.conf test is successful
9月 05 09:28:39 CentOS_VM systemd[1]: Started nginx - high performance web server.
9月 05 09:28:49 CentOS_VM systemd[1]: Stopping nginx - high performance web server...
9月 05 09:28:49 CentOS_VM systemd[1]: Stopped nginx - high performance web server.
2.5 檢視服務項的依賴關係
systemctl list-dependencies <服務項名稱>
2.6 查看出錯的服務
systemctl list-units --type=service --state=failed
2.7 清除服務項的錯誤狀態
systemctl reset-failed <服務項名稱>
2.8 檢視系統啟動耗時
systemd-analyze
2.9 檢視各項服務啟動耗時
systemd-analyze blame | grep .service
三、服務的管理
3.1 啟動服務
systemctl start <服務項名稱>
3.2 停止服務
systemctl stop <服務項名稱>
3.3 重啟服務
systemctl restart <服務項名稱>
3.4 重新讀取配置檔案
如果該服務不能重啟,但又必須使用新的配置,這條命令會很有用。
systemctl reload <服務項名稱>
3.5 使服務開機自啟動
systemctl enable <服務項名稱>
3.6 使服務不要開機自啟動
systemctl disable <服務項名稱>
3.7 禁用服務
這可以防止服務被其他服務間接啟動,也無法通過 start 或 restart 命令來啟動服務。
systemctl mask <服務項名稱>
3.8 啟用服務
僅針對於已禁用的服務。
systemctl unmask <服務項名稱>
3.9 重新讀取所有服務項
修改、新增、刪除服務項之後需要執行以下命令。
systemctl daemon-reload
四、簡單服務檔案的建立
4.1 服務檔案的位置
我們自己建立的服務檔案直接放在 /etc/systemd/system/
裡面就好了。服務檔案要使用 .service
字尾名。
如需修改軟體包或系統自帶的服務檔案,請先將原版服務檔案從 /lib/systemd/system/
拷貝到 /etc/systemd/system/
再進行修改。
4.2 服務檔案的模版
以下是最簡單的配置模版,直接根據提示或註釋修改引數值,然後去掉所有註釋即可。
[Unit]
Description=<服務描述>
After=<在哪個模組(服務)之後啟動(可選)>
[Service]
Type=<simple|forking|oneshot>
ExecStart=<程式或命令引數>
# 如果 "ExecStart=" 後面的程式或命令是在前臺持續執行的,那麼 "Type=" 後面應填寫 "simple"。
# 如果 "ExecStart=" 後面的程式或命令是在後臺持續執行的,那麼 "Type=" 後面應填寫 "forking"。
# 如果 "ExecStart=" 後面的程式或命令是在前臺執行一下就退出的,那麼 "Type=" 後面應填寫 "oneshot"。
ExecReload=<重新讀取配置檔案的命令(可選)>
KillSignal=SIGTERM
KillMode=mixed
[Install]
WantedBy=multi-user.target
說明
• 建立服務檔案之後,最好執行一下systemctl daemon-reload
再啟用。
五、Target & Runlevel
5.1 基本概念
Systemd 中的 target 可以理解為系統的“狀態點”。
一個 target
裡面一般包含多個 unit
,簡單點說就是包含需要啟動的服務組。
啟動了某個 target
就意味將系統置於某個“狀態點”。
Target 可以與傳統的 Runlevel 相對應,它們的對映關係如下表:
需要注意的是,與 Runlevel 相對應的 Target 一定不能夠同時啟動。
當設定了某個服務自啟動的時候,其實就是在往某個 target 的 .wants 目錄中新增服務項的符號連結而已(預設新增到 /etc/systemd/system/multi-user.target.wants
)。
表達能力真心有限……以下只介紹與 Runlevel 有關的命令。
5.2 檢視系統預設的啟動級別
systemctl get-default
5.3 切換到某個啟動級別
systemctl isolate <啟動級別對應的 target 名>
例如
切換到圖形介面
[root: ~]# systemctl isolate graphical.target
5.4 設定系統預設的啟動級別
systemctl set-default <啟動級別對應的 target 名>
六、日誌管理
6.1 開啟日誌持久化儲存
說明
• Systemd 預設只會把日誌儲存在記憶體中,一旦重啟系統日誌將全部丟失。所以強烈建議開啟該功能。
去掉 /etc/systemd/journald.conf
這個檔案內 Storage=
這一行前面的 #
號,然後將等號後面的內容改為 persistent
。
儲存配置檔案之後重啟一下日誌記錄服務即可。
systemctl restart systemd-journald.service
6.2 檢視自從本次開機後所有的日誌資訊
journalctl [-e] [-f]
-e
表示輸出之後跳轉到末行,下同。-f
表示實時滾動顯示,下同。
當沒有使用 -f
時,使用 PageUp
或 PageDown
翻頁,檢視完畢後按 q
退出。
6.3 檢視特定 Unit (服務)所有的日誌資訊
journalctl [-e] [-f] -u <Unit 名>
當沒有使用 -f
時,使用 PageUp
或 PageDown
翻頁,檢視完畢後按 q
退出。
6.4 檢視特定時間點內所有的日誌資訊
journalctl --since="yyyy-MM-dd hh:mm:ss" --until="yyyy-MM-dd hh:mm:ss"
使用 PageUp
或 PageDown
翻頁,檢視完畢後按 q
退出。
例如
檢視 2017 年 9 月 6 日 08:00:00
至 2017 年 9 月 6 日 08:20:00
之間的所有日誌
[root: ~]# journalctl --since="2017-09-06 08:00:00" --until="2017-09-06 08:20:00"
6.5 檢視日誌當前佔用的磁碟空間
journalctl --disk-usage
6.6 修改日誌最大佔用的磁碟空間
去掉 /etc/systemd/journald.conf
這個檔案內 SystemMaxUse=
這一行前面的 #
號,然後在等號後面填上數值即可。
例如
修改日誌最大佔用的磁碟空間為 50M
SystemMaxUse=50M
儲存配置檔案之後重啟一下日誌記錄服務即可。
systemctl restart systemd-journald.service