baicai

白菜

一个勤奋的代码搬运工!

Ubuntuは、systemdを使用してサービスの起動時の設定を行います。

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

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。