Systemd 入門(mén)ガイド:コマンド編 一、由來(lái):由來(lái)(由來(lái)) 2. Systemd 概要 ③ システム管理 3.1 systemctl 3.2 systemd-analyze 3.3 hostnamectl 3.4 localectl 3.5 timedatectl 3.6 loginctl 4、ユニット 4.1 範囲/意味 4.2 ユニットの狀態(tài) 4.3 ユニット管理 依存関係 5. Unitの設定ファイル 5.1 概要 5.2 設定ファイルの狀態(tài) 5.3 設定ファイルの形式 5.4 設定ファイルのブロック ⑥ ターゲット 第七、ログ管理 文書(shū)情報
著(zhù)者: 阮一峰:阮一峰(阮一峰)
Systemd はLinuxシステムツールで、起動(dòng)用です。 プロセスを監視するプログラム 多くのリリース版の標準設定となりました。
本文はその基本的な使い方を紹介し、上下の二篇に分けられています。今日は主なコマンドについて紹介します。
次のページ
実際に使う方法を紹介します。
歴史上、
リナックスの起動(dòng)
ずっと採用しています
init
プロセス。
以下のコマンドでサービスを起動(dòng)します。
xxxxxxxxxx
$ sudo /etc/init.d/apache2 start
# または
$ service apache2 start
この方法には二つの欠點(diǎn)があります。
一是起動(dòng)時(shí)間が長(cháng)い。
init
プロセスはシリアルで起動(dòng)し、前のプロセスが終わるまで次が始まりません。
二に、スクリプトの起動(dòng)が複雑です。
init
プロセスは起動(dòng)スクリプトを実行するだけで、他のことはしない。スクリプトは自分で様々な狀況を処理する必要があり、そのためスクリプトは長(cháng)くなる。
Systemdはこれらの問(wèn)題を解決するために生まれました。その設計の目的は、システムの起動(dòng)と管理に包括的な解決策を提供することです。
Linuxの慣習に従って、アルファベット
d
デーモンの略です。Systemdという名前は、システム全體を守ることを意味しています。
上図はSystemdの作者です Lennart Poettering )
Systemdを使用するので、もう必要ありません。
init
Systemdを取って代わった。
initd
システムの最初のプロセス(PIDは1)となり、他のプロセスはそのプロセスのものとされます。
xxxxxxxxxx
$ systemctl --version
上のコマンドで Systemd のバージョンを確認します。
Systemd 的優(yōu)點(diǎn)是功能強大,使用方便,缺點(diǎn)是體系龐大,非常復雜。事實(shí)上,現在還有很多人反對使用 Systemd,理由就是它過(guò)于復雜,與操作系統的其他部分強耦合,違反"keep simple, keep stupid"的
Unixの哲學(xué)
(上図は Systemd 架構図です)
Systemdは単一のコマンドではなく、システム管理に涉及するコマンド群です。
systemctl
Systemdのメインコマンドで、システムを管理します。
xxxxxxxxxx
システムリブート
$ sudo systemctl reboot
?
システムを終了し、電源を切ります。
$ sudo systemctl poweroff
?
CPUが停止しました。
$ sudo systemctl halt
?
システム停止
$ sudo systemctl suspend
?
我們一起進(jìn)入冬眠狀態(tài)吧
システムを冬眠モードに切り替えます
私たちも一緒に冬眠モードに入りましょう
$ sudo systemctl hibernate
?
システムをインタラクティブなハイバーノーモードに移行します。
$ sudo systemctl hybrid-sleep
?
救援狀態(tài)(ユーザー単一モード)に移行します
$ sudo systemctl rescue
systemd-analyze
起動(dòng)時(shí)間を確認するコマンドです。
xxxxxxxxxx
# 起動(dòng)時(shí)間を確認
$ systemd-analyze ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
# サービスごとの起動(dòng)時(shí)間を確認する
$ systemd-analyze blame
?
# アイコンの起動(dòng)プロセスを滝のように表示
$ systemd-analyze critical-chain
?
# 特定サービスの起動(dòng)ログ表示
$ systemd-analyze critical-chain atd.service
hostnamectl
コマンドは、現在のホストの情報を表示します。
xxxxxxxxxx
# 現在のホスト情報を表示
$ hostnamectl
?
ホスト名の設定
$ sudo hostnamectl set-hostname rhel7
localectl
創(chuàng )建コマンドを使用してローカライズ設定を確認します。
xxxxxxxxxx
# ローカライズ設定を確認
$ localectl
?
# ローカライズパラメータの設定。
$ sudo localectl set-locale LANG=en_GB.utf8
$ sudo localectl set-keymap en_GB
timedatectl
コマンドは現在の時(shí)帯設定を確認するために使用されます。
# 現在の時(shí)區設定を確認
$ timedatectl
?
# 全ての利用可能な時(shí)區を表示
$ timedatectl list-timezones ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
# 現在の時(shí)區を設定する
$ sudo timedatectl set-timezone America/New_York
$ sudo timedatectl set-time YYYY-MM-DD
$ sudo timedatectl set-time HH:MM:SS
loginctl
コマンドは現在ログインしているユーザーを確認するために使われます。
xxxxxxxxxx
現在のセッションを一覧表示します。
$ loginctl list-sessions
?
現在のログインユーザーを一覧表示してください。
$ loginctl list-users
?
# 指定ユーザーの情報を表示するリストを示す
$ loginctl show-user ruanyf
Systemdはすべてのシステムリソースを管理できます。異なるリソースは「ユニット」と総稱(chēng)されます。
ユニットは12種類(lèi)に分かれています。
systemctl list-units
コマンドで現在のシステムのすべてのユニットを確認できます。
xxxxxxxxxx
# 現在実行中の Unit 一覧
$ systemctl list-units
?
すべてのUnitをリストします。設定ファイルが見(jiàn)つからないものや起動(dòng)に失敗したものも含みます。
$ systemctl list-units --all
?
未実行のユニットをリストアップしてください。
$ systemctl list-units --all --state=inactive
?
# 加載に失敗したすべての Unit をリストアップ
$ systemctl list-units --failed
?
すべての実行中のserviceタイプのUnitをリストアップしてください。
$ systemctl list-units --type=service
systemctl status
コマンドは、システム狀態(tài)と個(gè)々のユニットの狀態(tài)を確認するために使用されます。
xxxxxxxxxx
システムの狀態(tài)を表示してください。
$ systemctl status
?
# 単一ユニットの狀態(tài)を表示
$ sysystemctl status bluetooth.service
?
# リモートホストの特定のユニットの狀態(tài)を表示
$ systemctl -H root@rhel7.example.com status httpd.service
除えて
status
命令:命令です。
systemctl
3つのクエリ狀態(tài)の簡(jiǎn)単な方法を提供しました。主にスクリプト內の判定文で使用されます。
xxxxxxxxxx
# 指定の Unit が実行中かどうかを表示
$ systemctl is-active application.service
?
# 指定のUnitが起動(dòng)失敗狀態(tài)かどうかを表示
$ systemctl is-failed application.service
?
# Unitサービスが起動(dòng)リンクを確立しているか確認
$ systemctl is-enabled application.service
ユーザーが最もよく使うコマンドは以下の通りです。これらはUnit(主にservice)を起動(dòng)?停止するためのものです。
xxxxxxxxxx
サービスをすぐに開(kāi)始してください。
$ sudo systemctl start apache.service
?
サービスをすぐに停止してください。
$ sudo systemctl stop apache.service
?
サービスを再起動(dòng)します
$ sudo systemctl restart apache.service
?
サービスのすべてのサブプロセスを終了する
$ sudo systemctl kill apache.service
?
サービスの設定ファイルを再読み込みします。
$ sudo systemctl reload apache.service
?
全ての変更された設定ファイルをリロードします。
$ sudo systemctl daemon-reload
?
# 某個(gè)ユニットの全ての下位パラメータを表示
$ systemctl show httpd.service
?
時(shí)間戳
# 表示時(shí)間戳的屬性
timestamp = 1640995200
# 指定 Unit
unit = "UnitName"
# 指定屬性
attribute = "Attribute"
# 獲取指定 Unit 的指定屬性的值
value = get_attribute_value(unit, attribute)
# 込出時(shí)間戳和屬性值
print("Timestamp: ", timestamp)
print("Attribute: ", value)
$ systemctl show -p CPUShares httpd.service
?
# 指定ユニットの屬性を設定する
$ sudo systemctl set-property httpd.service CPUShares=500
ユニット間に依存関係:AがBに依存する場(chǎng)合、SystemdはAを起動(dòng)するときにBも同時(shí)に起動(dòng)します。
systemctl list-dependencies
Unitの全ての依存関係をリストアップしてください。
xxxxxxxxxx
$ systemctl list-dependencies nginx.service
上記のコマンドの出力結果の中には、ターゲットタイプの依存関係があります(詳細は以下を參照してください)。デフォルトでは、ターゲットは展開(kāi)されません。ターゲットを展開(kāi)するには、次のようにします:
--all
パラメータ。
xxxxxxxxxx
$ systemctl list-dependencies --all nginx.service
各 Unit には設定ファイルがあり、それが Systemd に Unit の起動(dòng)方法を指示します。
systemdデフォルトのディレクトリ
/etc/systemd/system/
設定ファイルを読み込みます。しかし、その中には多くのシンボリックリンクがあり、それがディレクトリを指しています。
/usr/lib/systemd/system/
実際の設定ファイルはそのディレクトリにあります。
systemctl enable
コマンドは、その2つのディレクトリ間にシンボリックリンクを作成するために使用されます。
xxxxxxxxxx
$ sudo systemctl enable clamd@scan.service
同等に
$ sudo ln -s '/usr/lib/systemd/system/clamd@scan.service' '/etc/systemd/system/multi-user.target.wants/clamd@scan.service'
設定ファイルで起動(dòng)時(shí)の開(kāi)始が設定されていました。
systemctl enable
コマンドは起動(dòng)のトリガーに相當します。
それに対して、
systemctl disable
コマンドは、2つのディレクトリ間のシンボリックリンクを解除するために使用され、起動(dòng)時(shí)のロードを解除するのに相當します。
xxxxxxxxxx
$ sudo systemctl disable clamd@scan.service
設定ファイルの拡張子は、その Unit の種類(lèi)を示します。例えば、
sshd.socket
省略すると、Systemdのデフォルトの接尾辭は
.service
だからって
sshd
誤解されるかも
sshd.service
。
systemctl list-unit-files
コマンドはすべての設定ファイルをリストします。
xxxxxxxxxx
# すべての設定ファイルをリストアップしてください。
$ systemctl list-unit-files
?
# 指定タイプの設定ファイルを一覧表示する
$ systemctl list-unit-files --type=service
このコマンドはリストを出力します。
xxxxxxxxxx
$ systemctl list-unit-files
?
UNIT FILE ? ? ? ? ? ? STATE
chronyd.service ? ? ? enabled
clamd@.service ? ? ? ? static
clamd@scan.service ? ? disabled
このリストは各設定ファイルの狀態(tài)を示しており、合計で4種類(lèi)あります。
[Install]
(実行不可)、他の設定ファイルの依存関係としてのみ利用可
注意:設定ファイルの狀態(tài)から、このUnitが運行中かどうかは分かりません。これは前面で述べたことと同じです。
systemctl status
命令です。
xxxxxxxxxx
$ systemctl status bluetooth.service
設定ファイルを変更したら、SystemDが設定ファイルを再読み込みし、再起動(dòng)させる必要があります。それしないと変更は反映されません。
xxxxxxxxxx
$ sudo systemctl daemon-reload
$ sudo systemctl restart httpd.service
設定ファイルは通常のテキストファイルで、テキストエディタで開(kāi)けます。
systemctl cat
コマンドで設定ファイルの內容を確認できます。
xxxxxxxxxx
$ systemctl cat atd.service
?
[Unit]
Description=ATD daemon
?
[Service]
Type=forking
ExecStart=/usr/bin/atd
?
[Install]
WantedBy=multi-user.target
上記の表示から、設定ファイルはいくつかのブロックに分かれています。各ブロックの最初の行は、括弧で示される識別名で、例えば:
[Unit]
注意:設定ファイルのブロック名とフィールド名は、大文字小文字が區別されます。
各ブロック內には、等號で結ばれたキー値対があります。
xxxxxxxxxx
[Section]
Directive1=value
Directive2=value
?
. . .
[Unit]
ブロックは通常、設定ファイルの最初のブロックで、Unitのメタデータや他のUnitとの関係を定義するために使用されます。主なフィールドは以下の通りです。
Dsecription
簡(jiǎn)潔に説明
Documentation
:ドキュメントのURL
Requires
現在の Unit が依存する他の Unit が動(dòng)作していない場(chǎng)合、現在の Unit の起動(dòng)に失敗します。
Wants
現在の Unit と連攜している他の Unit が動(dòng)作していない場(chǎng)合、現在の Unit は起動(dòng)失敗しません。
BindsTo
:と
Requires
類(lèi)似で、指定されたUnitが退出すると、現在のUnitの動(dòng)作が停止します
Before
:指定のUnitが起動(dòng)する場(chǎng)合、そのUnitは現在のUnitの後で起動(dòng)する必要があります。
After
:指定のUnitが起動(dòng)する必要がある場(chǎng)合、そのUnitは現在のUnitより前に起動(dòng)する必要があります。
Conflicts
指定のUnitは現在のUnitと同時(shí)に実行できません。
Condition...
現在の Unit が実行するための必須條件、それが満たされないと実行されません。
Assert...
現在のUnitの動(dòng)作には満たす必要のある條件があります。それが満たされないと、起動(dòng)失敗が報告されます。
[Install]
通常は設定ファイルの最後のセクションで、起動(dòng)方法や自動(dòng)起動(dòng)の有無(wú)を定義します。主なフィールドは以下の通りです。
WantedBy
その値は、ターゲットの1つまたは複數です?,F在のユニットが有効(enable)時(shí)、シンボリックリンクが格納されます。
/etc/systemd/system
カタログの下に
Target 名 +
.wants
接尾辭で作成されたサブディレクトリ
RequiredBy
その値は1つ以上のTargetで、現在のUnitがアクティブな際にシンボリックリンクが設定されます。
/etc/systemd/system
カタログの下に
Target 名 +
.required
接尾辭で作成されたサブディレクトリ
Alias
現在の Unit が利用できるエイリアス
Also
現在の Unit 活動(dòng)(有効)中、同時(shí)に活性化される他の Unit
[Service]
ブロックはServiceの設定に用い、Service型のUnitのみがこのブロックを持っています。主要なフィールドは以下の通りです。
Type
プロセスの起動(dòng)時(shí)の挙動(dòng)を定義します。以下の値があります。
Type=simple
デフォルト値、実行
ExecStart
指定のコマンドでメインプロセスを起動(dòng)します。
Type=forking
親プロセスからforkメソッドで子プロセスを作成し、作成後親プロセスはすぐに終了します。
Type=oneshot
一時(shí)的なプロセス、Systemdは現在のサービスが終了するまで待ち、その後続行します
Type=dbus
現在のサービスはD-Busで起動(dòng)しています。
Type=notify
現在サービスが開(kāi)始されました。通知します。
Systemd
さらに下に進(jìn)む。
Type=idle
他のタスクが終わったら、そのサービスが動(dòng)く。
ExecStart
現在のサービスを起動(dòng)するコマンド
ExecStartPre
サービスを開(kāi)始する前に実行するコマンド
ExecStartPost
サービスを開(kāi)始後の実行コマンド
ExecReload
現在のサービスを再起動(dòng)する際に実行するコマンド
ExecStop
現在のサービスを停止する際に実行するコマンド
ExecStopPost
サービス停止後の命令を停止
RestartSec
現在のサービスの自動(dòng)再起動(dòng)の間隔(秒)
Restart
Systemdが自動(dòng)でサービスを再起動(dòng)する定義される條件:可能な値は以下の通りです。
always
いつも再起動(dòng)、
on-success
、
on-failure
、
on-abnormal
、
on-abort
、
on-watchdog
TimeoutSec
Systemdが現在のサービスを停止する前に待つ秒數を定義
Environment
指定環(huán)境変數
Unit設定ファイルの完全なフィールドリストは、參照してください。 公式文書(shū)
コンピュータの起動(dòng)時(shí)に多くの Unit を起動(dòng)する必要があります。毎回、起動(dòng)する Unit を一つずつ指定するのは非常に不便です。Systemd は、その解決策として Target を提供しています。
簡(jiǎn)單說(shuō),Target 就是一個(gè) Unit 組,包含許多相關(guān)的 Unit 。啟動(dòng)某個(gè) Target 的時(shí)候,Systemd 就會(huì )啟動(dòng)里面所有的 Unit。從這個(gè)意義上說(shuō),Target這個(gè)概念類(lèi)似于"狀態(tài)點(diǎn)",啟動(dòng)某個(gè) Target 就好比啟動(dòng)到某種狀態(tài)。
伝統的
init
起動(dòng)モードには RunLevel という概念があり、Targetと似ているが、RunLevelは排他で複數が同時(shí)に起動(dòng)できない。一方で、複數のTargetは同時(shí)に起動(dòng)可能。
xxxxxxxxxx
現在のシステムのすべてのターゲットを確認する
$ systemctl list-unit-files --type=target
?
ターゲットに含まれるすべてのユニットを確認する
$ systemctl list-dependencies multi-user.target
?
# 起動(dòng)時(shí)のデフォルトのターゲットを確認
$ systemctl get-default
?
# 設定起動(dòng)時(shí)のデフォルトのターゲット
$ sudo systemctl set-default multi-user.target
?
ターゲットの切り替え時(shí)、前のターゲットで開(kāi)始したプロセスをデフォルトで閉じない。
#systemctl isolateコマンドでこの行動(dòng)を変更します
ターゲットの前のすべてのプロセスを終了し、後のターゲットに屬さないものを除外
$ sudo systemctl isolate multi-user.target
ターゲットと伝統的なRunLevelの対応関係は以下の通りです。
xxxxxxxxxx
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
進(jìn)行の主な違いは以下の通りです。
デフォルトのRunLevel
(在
/etc/inittab
(ファイル設定)は今やデフォルトのターゲットに置き換えられました。場(chǎng)所は
/etc/systemd/system/default.target
當然、一般的に、シンボリックリンクは
graphical.target
(グラフィックユーザインターフェース)または
multi-user.target
(マルチユーザーコマンドライン)
(2)スクリプトの起動(dòng)場(chǎng)所
以前は、
/etc/init.d
目次、シンボリックリンクは異なるRunLevelディレクトリに指している(例えば)
/etc/rc3.d
、
/etc/rc5.d
現在は、(ここに)、所蔵されています。
/lib/systemd/system
「わ」
/etc/systemd/system
目次。
(3)設定ファイルの場(chǎng)所
以前:以前に
init
プロセスの設定ファイルは
/etc/inittab
各種サービスの設定ファイルは、
/etc/sysconfig
目次?,F在の設定ファイルは主に以下に保存されています。
/lib/systemd
目次、在
/etc/systemd
目次の修正は元の設定を上書(shū)きできます。
SystemdがすべてのUnitの起動(dòng)ログを統一管理します。これにより、利用できる利點(diǎn)は次の通りです:
journalctl
一つのコマンドで、すべてのログ(カーネルログおよびアプリケーションログ)を確認します。ログの設定ファイルは
/etc/systemd/journald.conf
。
journalctl
機能豊富、用途多岐にわたる。
# 全てのログを確認する(デフォルトでは、現在の起動(dòng)時(shí)のログのみ保存)
$ sudo journalctl
?
# カーネルログを確認(アプリケーションログは表示しない)
$ sudo journalctl -k
?
システムの起動(dòng)ログを確認してください。
$ sudo journalctl -b
$ sudo journalctl -b -0
?
前回起動(dòng)のログを確認(設定変更必要)
$ sudo journalctl -b -1
?
指定時(shí)刻の日誌を見(jiàn)る
$ 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
?
# 某個(gè)ユニットのログを確認する
$ sudo journalctl -u nginx.service
$ sudo journalctl -u nginx.service --since today
?
# 某特定ユニットの最新ログのリアルタイム表示
$ sudo journalctl -u nginx.service -f
?
# 多ユニットのログを統合表示
$ journalctl -u nginx.service -u php-fpm.service --since today
?
指定の優(yōu)先度(その以上のレベル)のログを確認します。全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
{
"以JSON格式(單行)輸出": "JSON形式で(一行で)出力してください"
}
```
$ sudo journalctl -b -u nginx.service -o json
?
以下は、あなたの提供する中國語(yǔ)の文章をJSON形式で簡(jiǎn)略化して翻訳したものです。
```json
{
"translation": "以下は、あなたの提供する中國語(yǔ)の文章をJSON形式で簡(jiǎn)略化して翻訳したものです。"
}
```
$ sudo journalctl -b -u nginx.serviceqq
-o json-pretty
?
ログが占めるハードディスクの空き容量を表示
$ sudo journalctl --disk-usage
?
指定ログファイルの最大占有サイズ
$ sudo journalctl --vacuum-size=1G
?
指定ログファイルの保存期間はどれくらいですか?
$ sudo journalctl --vacuum-time=1years
(終了)
最近使用した: