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

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