CentOSでサーバプロセス(デーモン)をサービス化する
こんにちは, 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