「Linuxで常駐プログラムを動かしたい」
「デーモンとサービスの違いがよくわからない・・・」
「Ubuntu・Debianでプログラムをサービス化したい」
このような場合には、この記事の内容が参考となります。
この記事では、Linuxにプログラムをサービスとして登録する方法を解説しています。
本記事の内容
- Linuxにおけるサービスとは?
- Linuxにプログラムをサービスとして登録する方法
それでは、上記に沿って解説していきます。
Linuxにおけるサービスとは?
サービスとは、常駐プログラムのことです。
常駐プログラムは、メモリ上で待機しているプログラムのことを指します。
そして、常駐プログラムはOS毎に呼び名が異なります。
OS | 常駐プログラムの呼称 |
UNIX系 | デーモン |
Windows | サービス |
あくまで、表現の違いに過ぎません。
他には、デーモンプロセスなどという言い方も存在します。
そのため、この記事ではサービスで呼び名を統一します。
つまり、LinuxにおけるサービスとはLinux上の常駐プログラムのことです。
そして、サービスを管理しているのがsystemdとなります。
systemdは、システム管理デーモンです。
また、このsystemdをコントロールするのがsystemctlコマンドになります。
例えば、nginxの再起動は次のコマンドを実行しますよね。
systemctl restart nginx
このコマンドは、systemdに対してnginxサービスを再起動するように指示しています。
サービスとして動くモノは、systemctlコマンドを経由する必要があるということです。
systemctlにより、サービスの集中管理を実現していると言えます。
ちなみに、起動中(active)のサービスは次のコマンドで確認できます。
$ systemctl list-units --type=service UNIT LOAD ACTIVE SUB DESCRIPTION > accounts-daemon.service loaded active running Accounts Service > acpid.service loaded active running ACPI event daemon > alsa-restore.service loaded active exited Save/Restore Sound Card State > apache2.service loaded active running The Apache HTTP Server > apparmor.service loaded active exited Load AppArmor profiles ・・・
以上、Linuxにおけるサービスを説明しました。
次は、Linuxにプログラムをサービスとして登録する方法を説明します。
Linuxにプログラムをサービスとして登録する方法
Linuxにプログラムをサービスとして登録する方法は、以下の手順となります。
- 専用ユーザー・グループの作成
- 設定ファイルの作成
- サービスファイルの作成
- ログ出力の設定
- サービスの登録
それぞれを下記で説明します。
上記の流れに沿って、次のプログラムを実際にサービス化します。
今回は、Metabaseのプログラムをサービス化していきます。
専用ユーザー・グループの作成
$ sudo groupadd -r metabase $ sudo useradd -r -s /bin/false -g metabase metabase
metabaseグループを新規に作成します。
そして、そのグループに属するユーザーmetabaseを追加。
「-s /bin/false」を指定することにより、metabaseはログインが出来ないユーザーとなります。
サービスを起動させることに特化したユーザーということです。
また、作成したユーザーにはディレクトリの権限を付与します。
対象となるのは、対象プログラムが利用するディレクトリです。
今回であれば、「/home/username/metabase」を対象とします。
この場合は、次のコマンドで所有権をすべて渡します。
$ sudo chown -R metabase:metabase /home/username/metabase
設定ファイルの作成
サービスが読み込む設定ファイルを作成します。
$ sudo touch /etc/default/metabase $ sudo chmod 640 /etc/default/metabase
/etc/default/metabase
MB_EMOJI_IN_LOGS=true # any other env vars you want available to Metabase
この内容は、プログラム毎に異なります。
Metabaseに関しては、最小限で上記の内容とします。
サービスファイルの作成
systemdにサービスだと認識させるために必要なファイルです。
このファイルにサービスの情報を記載します。
$ sudo touch /etc/systemd/system/metabase.service
ファイルの作成場所は、「/etc/systemd/system/」と決まっています。
書き方は、次の記事がドキュメントのようです。
serviceファイルの参考となるドキュメント
https://www.freedesktop.org/software/systemd/man/systemd.service.html
https://man7.org/linux/man-pages/man5/systemd.unit.5.html
Metabaseの場合は、次のような内容です。
/etc/systemd/system/metabase.service
[Unit] Description=Metabase server After=syslog.target After=network.target [Service] WorkingDirectory=/home/username/metabase ExecStart=/usr/bin/java -jar /home/username/metabase/metabase.jar EnvironmentFile=/etc/default/metabase User=metabase Type=simple StandardOutput=syslog StandardError=syslog SyslogIdentifier=metabase SuccessExitStatus=143 TimeoutStopSec=120 Restart=always [Install] WantedBy=multi-user.target
パス部分は、各自の環境に合わせて変更が必要です。
ログ出力の設定
サービスのログを出力する設定を行います。
syslogを利用して、ログにメッセージが出力されるように設定します
まずは、ログの出力先となるファイルを作成。
権限は、syslogが扱える権限とします。
$ sudo touch /var/log/metabase.log $ sudo chown syslog:adm /var/log/metabase.log
ちなみに、syslogもサービス(デーモン)です。
そして、このsyslogが登録するサービスを認識するための設定ファイルを作成します。
$ sudo touch /etc/rsyslog.d/metabase.conf
Metabaseの場合は、次のような内容となります。
/etc/rsyslog.d/metabase.conf
if $programname == 'metabase' then /var/log/metabase.log & stop
驚くぐらい簡単です。
要は、サービスとログの出力先を関連付けているだけですね。
サービス「metabase」は、metabase.serviceに記述した次の箇所となります。
SyslogIdentifier=metabase
では、この設定を反映させましょう。
syslogの再起動は、次のコマンドとなります。
$ sudo systemctl restart rsyslog.service
サービスの登録
最後に、対象となるプログラムをサービスに登録します。
正確には、作成したサービスファイルをsystemdに反映させます。
そのために実行するのは、以下のコマンドです。
$ sudo systemctl daemon-reload
このコマンドにより、編集(新規作成も含む)のあったserviceが読み込まれます。
では、サービスとなったプログラムを起動してみましょう。
$ sudo systemctl start metabase.service
起動しているかどうか確認です。
$ sudo systemctl status metabase.service ● metabase.service - Metabase server Loaded: loaded (/etc/systemd/system/metabase.service; disabled; vendor preset: enabled) Active: active (running) since Wed 2022-01-19 11:36:02 JST; 6s ago Main PID: 416033 (java) Tasks: 20 (limit: 9278) Memory: 268.6M CGroup: /system.slice/metabase.service └─416033 /usr/bin/java -jar /home/username/metabase/metabase.jar
問題ありません。
以下のコマンドが使えるようになりました。
$ sudo systemctl start metabase.service $ sudo systemctl stop metabase.service $ sudo systemctl restart metabase.service
これでMetabaseも立派なサービスになりました。
おまけです。
OS起動時にMetabaseが自動起動するようにも設定しておきます。
$ sudo systemctl enable metabase.service Created symlink /etc/systemd/system/multi-user.target.wants/metabase.service → /etc/systemd/system/metabase.service.
まとめ
Linuxにプログラムをサービスとして登録する方法を説明しました。
一見すると大変そうに見えるかもしれません。
しかし、内容を理解さえすれば、それほど大したことではありません。
これさえマスターすれば、自作のプログラムをサービス化することも可能になります。