1. 程式人生 > >Systemd 入門教程:命令篇 systemctl

Systemd 入門教程:命令篇 systemctl

一、系統管理

Systemd 並不是一個命令,而是一組命令,涉及到系統管理的方方面面。

1.1 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

1.2 systemd-analyze

systemd-analyze命令用於檢視啟動耗時。

# 檢視啟動耗時
$ systemd-analyze                                                                                       

# 檢視每個服務的啟動耗時
$ systemd-analyze blame

# 顯示瀑布狀的啟動過程流
$ systemd-analyze critical-chain

# 顯示指定服務的啟動流
$ systemd-analyze critical-chain atd.service

1.3 hostnamectl

hostnamectl命令用於檢視當前主機的資訊。

# 顯示當前主機的資訊
$ hostnamectl

# 設定主機名。
$ sudo hostnamectl set-hostname rhel7

1.4 localectl

localectl命令用於檢視本地化設定。

# 檢視本地化設定
$ localectl

# 設定本地化引數。
$ sudo localectl set-locale LANG=en_GB.utf8
$ sudo localectl set-keymap en_GB

1.5 timedatectl

timedatectl命令用於檢視當前時區設定。

# 檢視當前時區設定
$ timedatectl

# 顯示所有可用的時區
$ timedatectl list-timezones                                                                                   

# 設定當前時區
$ sudo timedatectl set-timezone America/New_York
$ sudo timedatectl set-time YYYY-MM-DD
$ sudo timedatectl set-time HH:MM:SS

1.6 loginctl

loginctl命令用於檢視當前登入的使用者。

# 列出當前session
$ loginctl list-sessions

# 列出當前登入使用者
$ loginctl list-users

# 列出顯示指定使用者的資訊
$ loginctl show-user ruanyf

二、Unit

2.1 含義

Systemd 可以管理所有系統資源。不同的資源統稱為 Unit(單位)。

Unit 一共分成12種:

  • Service unit:系統服務
  • Target unit:多個 Unit 構成的一個組
  • Device Unit:硬體裝置
  • Mount Unit:檔案系統的掛載點
  • Automount Unit:自動掛載點
  • Path Unit:檔案或路徑
  • Scope Unit:不是由 Systemd 啟動的外部程序
  • Slice Unit:程序組
  • Snapshot Unit:Systemd 快照,可以切回某個快照
  • Socket Unit:程序間通訊的 socket
  • Swap Unit:swap 檔案
  • Timer Unit:定時器

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

2.2 Unit 的狀態

systemctl status命令用於檢視系統狀態和單個 Unit 的狀態。

# 顯示系統狀態
$ systemctl status

# 顯示單個 Unit 的狀態
$ sysystemctl status bluetooth.service

# 顯示遠端主機的某個 Unit 的狀態
$ systemctl -H root@rhel7.example.com status httpd.service

除了status命令,systemctl還提供了三個查詢狀態的簡單方法,主要供指令碼內部的判斷語句使用。

# 顯示某個 Unit 是否正在執行
$ systemctl is-active application.service

# 顯示某個 Unit 是否處於啟動失敗狀態
$ systemctl is-failed application.service

# 顯示某個 Unit 服務是否建立了啟動連結
$ systemctl is-enabled application.service

2.3 Unit 管理

對於使用者來說,最常用的是下面這些命令,用於啟動和停止 Unit(主要是 service)。

# 立即啟動一個服務
$ sudo systemctl start apache.service

# 立即停止一個服務
$ sudo systemctl stop apache.service

# 重啟一個服務
$ sudo systemctl restart apache.service

# 殺死一個服務的所有子程序
$ sudo systemctl kill apache.service

# 重新載入一個服務的配置檔案
$ sudo systemctl reload apache.service

# 過載所有修改過的配置檔案
$ sudo systemctl daemon-reload

# 顯示某個 Unit 的所有底層引數
$ systemctl show httpd.service

# 顯示某個 Unit 的指定屬性的值
$ systemctl show -p CPUShares httpd.service

# 設定某個 Unit 的指定屬性
$ sudo systemctl set-property httpd.service CPUShares=500

2.4 依賴關係

Unit 之間存在依賴關係:A 依賴於 B,就意味著 Systemd 在啟動 A 的時候,同時會去啟動 B。

systemctl list-dependencies命令列出一個 Unit 的所有依賴。

$ systemctl list-dependencies nginx.service

上面命令的輸出結果之中,有些依賴是 Target 型別(詳見下文),預設不會展開顯示。如果要展開 Target,就需要使用–all引數。

$ systemctl list-dependencies --all nginx.service

三、Unit 的配置檔案

3.1 概述

每一個 Unit 都有一個配置檔案,告訴 Systemd 怎麼啟動這個 Unit 。

Systemd 預設從目錄/etc/systemd/system/讀取配置檔案。但是,裡面存放的大部分檔案都是符號連結,指向目錄/usr/lib/systemd/system/,真正的配置檔案存放在那個目錄。

systemctl enable命令用於在上面兩個目錄之間,建立符號連結關係。

$ sudo systemctl enable [email protected]
# 等同於
$ sudo ln -s '/usr/lib/systemd/system/[email protected]' '/etc/systemd/system/multi-user.target.wants/[email protected]'

如果配置檔案裡面設定了開機啟動,systemctl enable命令相當於啟用開機啟動。

與之對應的,systemctl disable命令用於在兩個目錄之間,撤銷符號連結關係,相當於撤銷開機啟動。

$ sudo systemctl disable clamd@scan.service

配置檔案的字尾名,就是該 Unit 的種類,比如sshd.socket。如果省略,Systemd 預設字尾名為.service,所以sshd會被理解成sshd.service。

3.2 配置檔案的狀態

systemctl list-unit-files命令用於列出所有配置檔案。

# 列出所有配置檔案
$ systemctl list-unit-files

# 列出指定型別的配置檔案
$ systemctl list-unit-files --type=service

這個命令會輸出一個列表。

$ systemctl list-unit-files

UNIT FILE              STATE
chronyd.service        enabled
[email protected]         static
[email protected]     disabled

這個列表顯示每個配置檔案的狀態,一共有四種。

  • enabled:已建立啟動連結
  • disabled:沒建立啟動連結
  • static:該配置檔案沒有[Install]部分(無法執行),只能作為其他配置檔案的依賴
  • masked:該配置檔案被禁止建立啟動連結

注意,從配置檔案的狀態無法看出,該 Unit 是否正在執行。這必須執行前面提到的systemctl status命令。

$ systemctl status bluetooth.service

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

$ sudo systemctl daemon-reload
$ sudo systemctl restart httpd.service

3.3 配置檔案的格式

配置檔案就是普通的文字檔案,可以用文字編輯器開啟。

systemctl cat命令可以檢視配置檔案的內容。

$ systemctl cat atd.service

[Unit]
Description=ATD daemon

[Service]
Type=forking
ExecStart=/usr/bin/atd

[Install]
WantedBy=multi-user.target

從上面的輸出可以看到,配置檔案分成幾個區塊。每個區塊的第一行,是用方括號表示的區別名,比如[Unit]。注意,配置檔案的區塊名和欄位名,都是大小寫敏感的。

每個區塊內部是一些等號連線的鍵值對。

[Section]
Directive1=value
Directive2=value

. . . . . .

注意,鍵值對的等號兩側不能有空格。

3.4 配置檔案的區塊

[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 執行必須滿足的條件,否則會報啟動失敗

[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 配置檔案的完整欄位清單,請參考官方文件

四、Target

啟動計算機的時候,需要啟動大量的 Unit。如果每一次啟動,都要一一寫明本次啟動需要哪些 Unit,顯然非常不方便。Systemd 的解決方案就是 Target。

簡單說,Target 就是一個 Unit 組,包含許多相關的 Unit 。啟動某個 Target 的時候,Systemd 就會啟動裡面所有的 Unit。從這個意義上說,Target 這個概念類似於”狀態點”,啟動某個 Target 就好比啟動到某種狀態。

傳統的init啟動模式裡面,有 RunLevel 的概念,跟 Target 的作用很類似。不同的是,RunLevel 是互斥的,不可能多個 RunLevel 同時啟動,但是多個 Target 可以同時啟動。

# 檢視當前系統的所有 Target
$ systemctl list-unit-files --type=target

# 檢視一個 Target 包含的所有 Unit
$ systemctl list-dependencies multi-user.target

# 檢視啟動時的預設 Target
$ systemctl get-default

# 設定啟動時的預設 Target
$ sudo systemctl set-default multi-user.target

# 切換 Target 時,預設不關閉前一個 Target 啟動的程序,
# systemctl isolate 命令改變這種行為,
# 關閉前一個 Target 裡面所有不屬於後一個 Target 的程序
$ sudo systemctl isolate multi-user.target

Target 與 傳統 RunLevel 的對應關係如下:

Traditional runlevel      New target name     Symbolically linked to...

Runlevel 0           |    runlevel0.target -> poweroff.target
Runlevel 1           |    runlevel1.target -> rescue.target
Runlevel 2           |    runlevel2.target -> multi-user.target
Runlevel 3           |    runlevel3.target -> multi-user.target
Runlevel 4           |    runlevel4.target -> multi-user.target
Runlevel 5           |    runlevel5.target -> graphical.target
Runlevel 6           |    runlevel6.target -> reboot.target

它與init程序的主要差別如下:

  1. 預設的 RunLevel(在/etc/inittab檔案設定)現在被預設的 Target 取代,位置是/etc/systemd/system/default.target,通常符號連結到graphical.target(圖形介面)或者multi-user.target(多使用者命令列)。
  2. 啟動指令碼的位置,以前是/etc/init.d目錄,符號連結到不同的 RunLevel 目錄 (比如/etc/rc3.d、/etc/rc5.d等),現在則存放在/lib/systemd/system和/etc/systemd/system目錄。
  3. 配置檔案的位置,以前init程序的配置檔案是/etc/inittab,各種服務的配置檔案存放在/etc/sysconfig目錄。現在的配置檔案主要存放在/lib/systemd目錄,在/etc/systemd目錄裡面的修改可以覆蓋原始設定。

個人微信公眾號:
這裡寫圖片描述

相關推薦

Systemd 入門教程命令 systemctl

一、系統管理 Systemd 並不是一個命令,而是一組命令,涉及到系統管理的方方面面。 1.1 systemctl systemctl是 Systemd 的主命令,用於管理系統。 # 重啟系統 $ sudo systemctl reboot # 關

Systemd入門教程命令(轉)

apache 完整 start -o 一是 analyze sudo one iso 作者: 阮一峰 日期: 2016年3月 7日 Systemd 是 Linux 系統工具,用來啟動守護進程,已成為大多數發行版的標準配置。 本文介紹它的基本用法,分

Systemd入門教程實戰(轉)

現在 重啟 penssh span 日誌 才會 查看 筆記本 dep 作者: 阮一峰 日期: 2016年3月 8日 上一篇文章,我介紹了 Systemd 的主要命令,今天介紹如何使用它完成一些基本的任務。 一、開機啟動 對於那些支持 Systemd 的軟

CentOS_7 Systemd 入門教程實戰

一、開機啟動 對於那些支援 Systemd 的軟體,安裝的時候,會自動在/usr/lib/systemd/system目錄新增一個配置檔案。 如果你想讓該軟體開機啟動,就執行下面的命令(以httpd.service為例)。 $ sudo systemctl enable

Linux Capabilities 入門教程概念

原文連結:Linux Capabilities 入門教程:概念篇 Linux 是一種安全的作業系統,它把所有的系統許可權都賦予了一個單一的 root 使用者,只給普通使用者保留有限的許可權。root 使用者擁有超級管理員許可權,可以安裝軟體、允許某些服務、管理使用者等。 作為普通使用者,如果想執行某些只有

Vue入門教程node安裝vue命令列工具及啟動專案

安裝淘寶npm映象 npm install -g cnpm --registry=https://registry.npm.taobao.org 全域性安裝vue命令列工具 cnpm inst

Linux Capabilities 入門教程基礎實戰

該系列文章總共分為三篇: Linux Capabilities 入門教程:概念篇 Linux Capabilities 入門教程:基礎實戰篇 待續... 上篇文章介紹了 Linux capabilities 的誕生背景和基本原理,本文將會通過具體的示例來展示如何檢視和設定檔案的 capabilities。

Linux Capabilities 入門教程進階實戰

> 原文連結:[https://fuckcloudnative.io/posts/linux-capabilities-in-practice-2/](https://fuckcloudnative.io/posts/linux-capabilities-in-practice-2/) 該系列文章總共分為三

Flex 布局教程語法

https stat token flow tutorial ble 布局 fault contain 作者: 阮一峰 日期: 2015年7月10日 網頁布局(layout)是 CSS 的一個重點應用。 布局的傳統解決方案,基於盒狀模型,依賴 display 屬性

Flex 布局教程語法 作者 阮一峰

num 完全 tutorials eight 項目 default size webkit http 網頁布局(layout)是 CSS 的一個重點應用。 布局的傳統解決方案,基於盒狀模型,依賴 display 屬性 + position屬性 + float屬性。它對於那

Ehcache入門經典第二ehcache.xml的參數

new evict 正在 關閉 讀數 memory intervals 忽略 mes 繼續第一篇 diskStorepath:指定在硬盤上存儲對象的路徑path屬性可以配置的目錄有: user.home(用戶的家目錄) user.dir(用戶當前的工作目錄)

ubuntu快速入門教程初次見面

切換 優化 第三方軟件 技術分享 計算 shu 做的 基本 移動設備 1 什麽是ubuntu? Ubuntu(友幫拓、優般圖、烏班圖)是一個以桌面應用為主的開源GNU/Linux操作系統,Ubuntu 是基於Debian GNU/Linux,支持x86、amd64(即x6

HTML5入門教程 Cookie會話跟蹤技術~

會話跟蹤 嵌入 網絡 影響 自動 img 更改 txt文件 發送 1. Cookie會話跟蹤技術介紹 會話跟蹤是Web程序中常用的技術,用來跟蹤用戶的整個會話。常用的會話跟蹤技術是Cookie與Session。Cookie通過在客戶端記錄信息確定用戶身份,可以在客戶端保存臨

Flex 布局教程語法(摘抄,學習中)

有關 之前 表示 技術 play under line -c 內容 網頁布局(layout)是CSS的一個重點應用。 布局的傳統解決方案,基於盒狀模型,依賴 display屬性 + position屬性 + float屬性。它對於那些特殊布局非常不方便,比如,垂直居中就不

HTML5前端入門教程簡析正則表達式

分開 mail 出現 字符串匹配 很多 字符串操作 一個 來看 條件 很多人對正則表達式的印象都是用來做表單驗證的,這其實是不大準確的。正則表達式目前在很多軟件中都得到了廣泛的應用,包括Linux,Unix等操作系統,VB,Java,PHP等開發環境中,以及很多應用軟件都能

HTML5前端入門教程Ajax 異步請求技術

結合 adding 情況下 編寫 安全 ont format loaded ruby AJAX的全稱是Asynchronous JavaScript and XML(異步的 JavaScript 和 XML)。 ?ajax不是新的編程語言,而是一種使用現有標準的新方法

hadoop快速入門教程hadoop安裝包下載與監控參數說明

分布式 height tex region 集群 RoCE 發行版 store serve 前階段用了差不多兩周的時間把DKhadoop的運行環境搭建以及安裝的各個操作都介紹了一遍。關於DKhadoop安裝包下載也只是順帶說了一下,但好像大快搜索的服務器在更新,新的下載頁面

springBoot快速入門教程(第一

Springboot是什麼? 1、springboot是在spring的基礎上進一步封裝,讓以前繁雜的配置全部簡化,從而快速構建專案。 2、對主流框架無配置整合,提高開發效率。 3、內建tomcat無需先部署在執行 4、與雲端計算天然整合 快速搭建一個簡單的springboot

DbForge Query Builder for SQL Server入門教程如何操縱檔案

【dbForge Query Builder for SQL Server下載】 該文描述瞭如何在dbForge Query Builder for SQL Server中操作文件。 管理檔案 在Windows Dialog Box讓你和檔案之間切換進行管理。要開啟它,請從“ Windo

DbForge Query Builder for SQL Server入門教程在Grid Overview中編輯資料

【dbForge Query Builder for SQL Server下載】 當dbForge Query Builder for SQL Server執行任何返回結果集的語句時,檢索到的資料將顯示在同一SQL文件的資料檢視的資料編輯器中。本主題說明如何編輯網格中的資料。 插入,刪除,複