SystemdでOS起動/停止時にスクリプトを実行する方法

Systemdは、現在のLinuxシステムで広く使用されているシステムマネージャの一つです。Systemdは、システムの起動や停止時の処理を管理する可能性がありますが、特定のスクリプトを実行する必要がある場合があります。この記事では、Systemdを使用して、OSの起動や停止時にスクリプトを実行する方法について解説します。スクリプトの作成から、Systemdへの登録まで、具体的なステップを紹介します。

SystemdでOS起動/停止時にスクリプトを実行する方法

Systemdは、Linuxディストリビューションで使用されているinitシステムの一つです。Systemdを使用すると、OS起動時や停止時にスクリプトを自動で実行することができます。この記事では、SystemdでOS起動/停止時にスクリプトを実行する方法を解説します。

Systemdの基本概念

Systemdでは、システムの起動や停止を管理するために、サービスと呼ばれる概念が使用されます。サービスは、システムの起動時や停止時に実行されるプロセスを定義するための設定ファイルです。サービスファイルは、通常、/etc/systemd/system/ディレクトリに配置されます。

サービスファイルの作成

サービスファイルを新規作成するには、次の手順に従います。 1. /etc/systemd/system/ディレクトリに移動します。 2. viコマンドやnanoコマンドを使用して新規ファイルを作成します。 3. サービスファイルのファイル名は、「.service」という拡張子を付ける必要があります。

サービスファイルの内容

サービスファイルには、次の内容が必要です: [Service] Type=oneshot ExecStart=/path/to/script [Unit] Description=サービス名 After=network.target [h3]

Tera TermでSSH接続!公開鍵認証の設定方法
オプション名説明
Typeサービスタイプを指定します。oneshotは、サービスが起動時に実行され、自動で停止するタイプです。
ExecStartサービスが起動時に実行するコマンドを指定します
Descriptionサービス名を指定します
Afterサービスが起動する前に実行されるサービスを指定します

サービスファイルの有効化

サービスファイルを作成したら、システムに登録する必要があります。次のコマンドを実行します: systemctl daemon-reload

サービスファイルの自動起動設定

サービスファイルを登録したら、OS起動時に自動で起動するように設定する必要があります。次のコマンドを実行します: systemctl enable サービス名 これで、SystemdでOS起動/停止時にスクリプトを実行する方法が完了です。

ExecStartとは何ですか?

execStartとは、systemdのサービスファイル(.service)で使用される指令の一つで、サービスを開始する際に実行するコマンドを指定するために使用されます。

ExecStartの基本的な使用方法

ExecStartは、サービスを開始する際に実行するコマンドを指定するために使用されます。たとえば、Webサーバーのサービスファイルでは、ExecStartにApacheの起動コマンドを指定することができます。

Ubuntu 14.04 LTSインストール&設定ガイド
  1. ExecStart=/usr/sbin/httpd -D FOREGROUND
  2. ExecStart=/usr/bin/docker run -d –name my-container my-image
  3. ExecStart=/usr/local/bin/my-service -c /etc/my-service/config.conf

ExecStartのオプション

ExecStartにはいくつかのオプションがあり、サービスを開始する際の動作を制御できます。たとえば、ExecStartPreとExecStartPostを使用すると、サービスを開始する前に、また後に実行するコマンドを指定できます。

  1. ExecStartPre=/usr/bin/mkdir -p /var/run/my-service
  2. ExecStartPost=/usr/bin/chown -R my-user:my-group /var/run/my-service
  3. ExecStart=/usr/local/bin/my-service -c /etc/my-service/config.conf

ExecStartのトラブルシューティング

ExecStartに指定されたコマンドが実行されない場合、サービスが正常に開始出来ない可能性があります。ExecStartのトラブルシューティングは、サービスログを確認することから始めることができます。サービスログを確認することで、ExecStartに指定されたコマンドの実行結果を確認できます。

  1. systemctl status my-service
  2. journalctl -u my-service
  3. _systemctl show my-service | grep ExecStart

UbuntuでSystemctlの自動起動設定を確認するには?

システムサービスをリストアップする

/etc/systemd/system/ などのディレクトリに格納されているサービスファイルを確認することで、自動起動設定を確認できます。例えば、sshサービスについては、sshd.serviceファイルがあることを確認できます。システムサービスをリストアップするには、以下のコマンドを実行します。

  1. systemctl list-units コマンドで、現在動作中のサービスを確認することができます。
  2. systemctl list-units –type=service コマンドで、サービスだけを絞り込んで確認することができます。
  3. systemctl status sshd コマンドで、sshサービスについての詳細情報を確認することができます。

サービスファイルの確認

システムサービスファイルの確認によって、自動起動設定を確認できます。サービスファイルには、[Unit][Install][Service] の3つのセクションがあります。自動起動設定は、[Install] セクションの WantedBy= という行に記述されています。サービスファイルを確認するには、以下の手順に従います。

Ubuntu 16.04 LTSインストール後の初期設定
  1. sudo vim /etc/systemd/system/sshd.service コマンドで、sshサービスファイルを編集モードで開きます。
  2. / WantedBy= と入力して、WantedBy= の行を検索します。
  3. WantedBy=multi-user.target という行があることを確認します。この行は、sshサービスが multi-user.target によって自動起動されることを示しています。

自動起動設定の変更

サービスファイルの編集によって、自動起動設定を変更することができます。自動起動設定の変更には、システム管理者の権限が必要です。自動起動設定を変更するには、以下の手順に従います。

  1. sudo vim /etc/systemd/system/sshd.service コマンドで、sshサービスファイルを編集モードで開きます。
  2. / WantedBy= と入力して、WantedBy= の行を検索します。
  3. WantedBy=network.target に変更して保存します。この変更は、sshサービスが network.target によって自動起動されるように変更します。

Systemd OneshotとSimpleの違いは何ですか?

Systemdは、Linuxシステムのデーモンとサービスを管理するために使用されるシステム管理ツールである。 OneshotとSimpleは、Systemdのサービスタイプの2つの主要な種類である。 Oneshotサービスは、指定されたコマンドを実行し、そのジョブが完了すると終了するサービスである。一方、Simpleサービスは、サービスプロセスがメインプロセスとして実行され、サービスがロードされるだけである。

Oneshotサービス

Oneshotサービスは、指定されたコマンドを実行し、そのジョブが完了すると終了するサービスである。そのためには、「Type=oneshot」という記述が必要である。また、Oneshotサービスは、他のサービスとの依存関係を定義するために「RemainAfterExit=yes」という設定を使用する必要がある。

  1. サービスプロセスが完了したあとに、サービスが終了する。
  2. RemainAfterExit=yes設定により、サービスが終了してもサービスプロセスが残る。
  3. サービスプロセスが再度実行されるたびに、サービスが再起動する。

Simpleサービス

Simpleサービスは、サービスプロセスがメインプロセスとして実行され、サービスがロードされるだけである。そのためには、「Type=simple」という記述が必要である。Simpleサービスは、サービスプロセスがリアルタイムに実行されるため、サービスプロセスが完了するまでサービスが終了しない。

Ubuntu 20.04.2 LTSにTerraformをインストールする方法
  1. サービスプロセスがリアルタイムに実行される。
  2. サービスプロセスが完了するまでサービスが終了しない。
  3. サービスプロセスが終了するとサービスが終了する。

OneshotとSimpleの違い

OneshotサービスとSimpleサービスの違いは、サービスプロセスの実行方法とサービス終了条件にある。Oneshotサービスは、サービスプロセスが完了すると終了するが、Simpleサービスはサービスプロセスがリアルタイムに実行されるため、サービスプロセスが完了するまでサービスが終了しない。

  1. サービスプロセスの実行方法:Oneshotサービスは、サービスプロセスを指定されたコマンドとして実行し、Simpleサービスはサービスプロセスをメインプロセスとして実行する。
  2. サービス終了条件:Oneshotサービスは、サービスプロセスが完了すると終了し、Simpleサービスはサービスプロセスが完了するまでサービスが終了しない。
  3. サービスプロセスの管理:Oneshotサービスは、サービスプロセスを管理するためにRemainAfterExit=yes設定を必要とするが、Simpleサービスはサービスプロセスをリアルタイムに実行するため、サービスプロセスの管理が必要ない。

Linuxでサービスを起動するコマンドは?

Linuxでサービスを起動するコマンドは、 systemctl または service コマンドを使用します。

systemctlコマンドの使用法

systemctlコマンドは、Systemdが導入された systemdベースのシステムで使用されます。サービスを起動するには、以下のコマンドを実行します。

  1. systemctl start サービス名

例:systemctl start httpd

Ubuntu 20.04をAutoInstallで自動インストール!

serviceコマンドの使用法

serviceコマンドは、SystemVが導入されたシステムで使用されます。サービスを起動するには、以下のコマンドを実行します。

  1. service サービス名 start

例:service httpd start

自動起動の設定

サービスを自動起動するには、以下のコマンドを実行します。

  1. systemctl enable サービス名
  2. systemctl daemon-reload
  3. systemctl start サービス名

または

  1. chkconfig サービス名 on

よくある質問

Systemdを使用してOS起動/停止時にスクリプトを実行する方法は何ですか?

Systemdを使用してOS起動/停止時にスクリプトを実行するには、systemd-sysvコマンドを使用して、systemdのサービスファイルを作成する必要があります。このファイルでは、スクリプトの実行権限や実行タイミングを指定します。また、ExecStartExecStopなどのオプションを使用して、実行するコマンドを指定することもできます。

スクリプトの実行順序はどう決まっていますか?

スクリプトの実行順序は、systemdの依存関係によって決まります。システム起動時に実行されるサービスは、/etc/systemd/systemディレクトリ内のサービスファイルにWantedByRequiredByなどの依存関係を指定することで、他のサービスとの依存関係を定義できます。停止時には、StopWhenUnneededオプションを使用して、必要なくなったサービスを停止するように指定できます。

スクリプトの実行ログはどこに保存されますか?

スクリプトの実行ログは、syslogに保存されます。syslogでは、実行されたコマンドや出力されたログメッセージを確認することができます。さらに、journalctlコマンドを使用して、systemdのログを確認することもできます。ログの保存先は、/var/log/syslog/var/log/messagesなど、システムによって異なります。

システム起動時に失敗した場合の対処方法は?

システム起動時に失敗した場合、systemctlコマンドを使用して、サービスを再起動することができます。また、systemctl statusコマンドを使用して、サービスステータスを確認することもできます。また、emergency.target rescue.targetなどのターゲットを指定することで、システムを救済モードで起動することもできます。

Anzai Hotaka

10 年の経験を持つコンピュータ エンジニア。Linux コンピュータ システム管理者、Web プログラマー、システム エンジニア。