Linux共通

systemdに自分のプログラムを追加・登録する方法

概要

systemdはLinuxシステムでサービスの起動、停止、管理を行うためのシステム管理デーモンです。自作プログラムをsystemdのサービスとして登録することで、システムの起動時に自動的にプログラムが起動したり、必要に応じて再起動することが可能です。

メリット

  1. 自動化: システムの起動時や停止時にプログラムが自動的に管理されます。
  2. 手動制御の容易さ: systemctl startsystemctl stop コマンドを使って簡単にプログラムを制御できます。
  3. 耐障害性: Restart=always オプションを設定することで、プログラムが予期せず終了した場合でも自動的に再起動します。

手順

1.スクリプトの作成: プログラムを起動・停止するシェルスクリプトを作成します。

# vi /usr/local/start-program.sh
# vi /usr/local/stop-program.sh

それぞれに記述する内容はこちら。
(プログラム起動)に作成したプログラムを起動するコマンドを記載します。

#!/bin/bash
# start-script.sh
echo "Starting my program..."
(プロセス起動)

# stop-script.sh
echo "Stopping my program..."
(プロセス停止)

2.Unitファイルの作成: /etc/systemd/system/ に以下の内容で userprogram.service ファイルを作成します。

# vi /etc/systemd/system/userprogram.service

[Unit]
Description=User Program Services
After=network.target

[Service]
Type=oneshot
ExecStart=/usr/local/start-program.sh
ExecStop=/usr/local/stop-program.sh
RemainAfterExit=yes
Restart=always

[Install]
WantedBy=multi-user.target

Unit : サービスの説明や依存関係を定義します。
Service : サービスの動作やスクリプトの実行方法を設定します。
     ExecStart/ExecStopに先ほど作成したスクリプトを指定しています。
     Restart=alwaysを追加すると落ちたときに自動再起動してくれます。
Install : サービスがどのランレベルで有効化されるかを指定します。
     GUIで起動する

3.サービスファイルの権限設定:

# chmod 644 /etc/systemd/system/userprogram.service

4.サービスの有効化と起動:

# systemctl enable userprogram.service
# systemctl start userprogram.service

起動したらstatusを確認してみましょう。

# systemctl status userprogram.service
● userprogram.service - User Program Services
   Loaded: loaded (/usr/lib/systemd/system/userprogram.service; enabled; vendor preset: disabled)
   Active: active (exited) since 木 2024-03-21 13:02:25 JST; 16min ago
  Process: 2071 ExecStart=/usr/local/start-program.sh (code=exited, status=0/SUCCESS)
 Main PID: 2071 (code=exited, status=0/SUCCESS)

Loaded:Unitファイル名、自動起動がenabled
Active:activeは起動状態、deadは停止状態

簡単な見方
・Loaded:のカッコ()内のenabledは自動起動on
・Active: activeが起動状態