Linuxでサービス(デーモンプロセス )を登録する

Linuxでサービス(デーモンプロセス )を登録する サーバー

「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にプログラムをサービスとして登録する方法を説明しました。
一見すると大変そうに見えるかもしれません。

しかし、内容を理解さえすれば、それほど大したことではありません。
これさえマスターすれば、自作のプログラムをサービス化することも可能になります。

タイトルとURLをコピーしました