👻

CentOSでサーバプロセス(デーモン)をサービス化する

2021/01/03に公開

こんにちは, Zenn.
以前の投稿ではApache Supersetを導入して管理コンソールにログインできるようにしました。ただSupersetはサーバプログラムなので、コマンドラインで起動するとターミナルを起動したままにしなければなりません。

ちょっとイケてないので改良します。
具体的にはSupersetプロセスをCentOSのsystemctlコマンドで管理してしまいます。

Supersetに限らず、自作のサーバプログラム等でも適用できるので、適宜参考にしてみてください。

目標

superset runserver ではなく systemctl コマンドでSupersetを起動する

systemctlとは
CentOS(Linux)のシステムサービスやデーモンを管理する機能です。本記事では詳細は省きますが、systemctlでWEB検索すると多数の解説ページがヒットします。

サービスを追加

Unitを定義

systemctlではUnitという単位でプログラムや処理を管理します。SupersetをUnitとして新たに定義をします。

vi /etc/systemd/system/superset.service
[Unit]
Description=superset daemonized by systemd
After=network.target

[Service]
Type=simple
User=root
EnvironmentFile=/etc/sysconfig/superset.conf
ExecStart=/opt/visual/bin/superset runserver -p $PORT
Restart=on-failure

[Install]
WantedBy=multi-user.target

Configを設定

サービス起動時に読み込ませる設定を設定ファイル(.conf)に記述します。一般に、環境変数はこちらに記述します。

vi /etc/sysconfig/superset.conf
PORT=8088
PATH=/opt/visual/bin:$PATH
PYTHONPATH=/opt/visual:$PYTHONPATH

サービスを追加

作成したUnit/Serviceをsystemctlに認識させるため、リロードします。

# systemctl daemon-reload

サービスを起動

サービスの追加は完了しているので起動してみます。

# systemctl start superset

superset runserverコマンドを実行したときは文字列が出力されましたが、systemctlでは特に出力はありません。

サービスの状態を確認するには、systemctlのオプションstatusを実行します。

# systemctl status superset

正常かどうしていれば、例えば、次のような出力が得られます。

● superset.service - superset daemonized by systemd
   Loaded: loaded (/etc/systemd/system/superset.service; disabled; vendor preset: disabled)
   Active: active (running) since 木 2019-01-10 03:18:56 JST; 2s ago
 Main PID: 31202 (superset)
    Tasks: 1
   CGroup: /system.slice/superset.service
           └─31202 /opt/visual/bin/python3.6 /opt/visual/bin/superset runserver -p 8088

 1月 10 03:18:56 visual systemd[1]: Started superset daemonized by systemd.

1行目の出力で、supersetがデーモン化(daemonized)されていることが読み取れます。
3行目の出力で、このサービスが正常稼働(active)であることが読み取れます。

ちなみに、終了するときには systemctl stop superset とかで停止できます。

まとめ

サーバプログラムをターミナルで起動させっぱなしよりもカッコよく運用できるようになりました。

Discussion