systemd#
Systemd は Linux システムツールであり、デーモンプロセスの起動に使用され、ほとんどのディストリビューションで標準の設定となっています。
由来#
過去には、Linux の起動には init プロセスが使用されていました。
以下のコマンドはサービスを起動するために使用されます。
$ sudo /etc/init.d/apache2 start
# または
$ service apache2 start
この方法には 2 つの欠点があります。
1 つ目は起動時間が長いことです。init プロセスは直列的に起動され、前のプロセスが完全に起動するまで次のプロセスは起動しません。
2 つ目は起動スクリプトが複雑であることです。init プロセスは起動スクリプトを実行するだけであり、他のことには関与しません。スクリプトはさまざまな状況を自分で処理する必要があり、その結果、スクリプトは非常に長くなることがよくあります。
Systemd 概要#
Systemd はこれらの問題を解決するために作成されました。その設計目標は、システムの起動と管理に完全なソリューションを提供することです。
Linux の慣例に従い、d はデーモン(daemon)の略です。 Systemd という名前の意味は、それがシステム全体を監視することです。
Systemd を使用すると、init を使用する必要はありません。Systemd は initd を置き換えて、システムの最初のプロセス(PID が 1)となり、他のプロセスはその子プロセスとなります。
$ systemctl --version
上記のコマンドは Systemd のバージョンを表示します。
systemd を使用してシェルスクリプトを起動時に実行する#
一般的な手順#
起動時にすぐに実行されるスクリプトを作成します。この記事では、スクリプトの場所を /home/navxin/Example/startup.sh とし、スクリプトの内容は次のとおりです。
#!/bin/bash
# スクリプトと同じディレクトリにStartupTouch.txtという名前のファイルを作成する
touch /home/navxin/Example/startup.sh.txt
起動時に実行されるスクリプトに実行権限を追加するには、次のコマンドを使用します。#
chmod u+x /home/navxin/Example/startup.sh
chmod g+x /home/navxin/Example/startup.sh
systemd の service ディレクトリに移動し、多くのサービス設定ファイルが表示されることを確認するには、次のコマンドを使用します。#
# systemdのserviceディレクトリに移動する
cd /usr/lib/systemd/system
# ファイルリストを表示する
ls -al
このディレクトリには、起動時に実行するスクリプトを設定するための新しい.serviceファイルを作成します。この例では、ファイル名はStartupExample.serviceであり、実行するコマンドとファイルの設定内容は次のとおりです。
サービス設定ファイルを作成する#
sudo touch /usr/lib/systemd/system/StartupExample.service
以下は StartupExample.service 設定ファイルの内容です。
[Unit]
Description=Startup Example
[Service]
ExecStart=/home/navxin/Example/startup.sh
[Install]
WantedBy=multi-user.target
新しく作成した service を手動で実行してみるには、次のコマンドを使用します。#
# StartupExample.serviceを手動で実行する
sudo systemctl start StartupExample.service
# 実行ログを表示する
systemctl status StartupExample.service
# テスト時に作成したファイルを削除する
rm -f /home/navxin/Example/startup.sh.txt
# サービスを有効にして、起動時に実行できるようにする
sudo systemctl enable StartupExample.service
# マシンを再起動する
systemctl reboot
付記:Unit#
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:プロセス間通信のソケット
Swap Unit:スワップファイル
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
# 実行中のタイプがmountのすべてのUnitをリストアップする
$systemctl list-units --type=mount
# すべての設定ファイルをリストアップする
$systemctl list-unit-files
$systemctl list-unit-files --type=mount
myadmin.service ファイルを編集し、次のステートメントを追加します。
After=network-online.target remote-fs.target nss-lookup.target navxin-kn1.mount
Wants=network-online.target
ファイル全体の内容は以下の通りです(一部は nginx.service を参考にしています):
# /lib/systemd/system/myadmin.service
[Unit]
Description=Start myAdmin web server
Documentation=https://www.lyhuilin.com/
After=network-online.target remote-fs.target nss-lookup.target navxin-kn1.mount
Wants=network-online.target
[Service]
Environment="WELCOME=Baicai myAdmin Base Environment."
ExecStartPre=/bin/echo ${WELCOME}
ExecStart=/baicai/systemdStart/my_admin/my_admin -c /baicai/systemdStart/my_admin/conf/config.yaml
ExecStop=/bin/kill -s TERM ${MAINPID}
[Install]
WantedBy=multi-user.target