1. 程式人生 > 其它 >[Conda&pip] 換清華源、匯出/恢復虛擬環境

[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 管理項稱為 unitunit可以有很多型別。本文僅介紹 .service 型別和 .target 的 unit 。
3. 本文適用於所有使用 Systemd 的作業系統,不侷限於 CentOS 7。

二、服務、系統狀態的檢視

2.1 檢視系統所有安裝的服務項

systemctl list-unit-files --type=service

使用 PageUpPageDown 翻頁,檢視完畢後按 q 退出。

2.2 檢視系統所有執行的服務項

systemctl list-units --type=service

如果看到某個服務項前面有一個紅點,說明該服務存在問題,請進行排查。

使用 PageUpPageDown 翻頁,檢視完畢後按 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 時,使用 PageUpPageDown 翻頁,檢視完畢後按 q 退出。

6.3 檢視特定 Unit (服務)所有的日誌資訊

journalctl [-e] [-f] -u <Unit 名>

當沒有使用 -f 時,使用 PageUpPageDown 翻頁,檢視完畢後按 q 退出。

6.4 檢視特定時間點內所有的日誌資訊

journalctl --since="yyyy-MM-dd hh:mm:ss" --until="yyyy-MM-dd hh:mm:ss"

使用 PageUpPageDown 翻頁,檢視完畢後按 q 退出。

例如

檢視 2017 年 9 月 6 日 08:00:002017 年 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

七、參考文獻

  1. Systemd (簡體中文) - ArchWiki
  2. Systemd 入門教程:命令篇
  3. Linux 系統開機啟動項清理
  4. systemd 官方文件