PythonプログラムをSystemctlに登録する方法

PythonとWSGIなどを使ってAPIサーバを立ち上げたりなど、常時Pythonプログラム起動させておきたい場面がちょくちょく発生します。
今回はUbuntu環境でPythonプログラムをSystemctlに登録する方法を紹介します。

MEMO
すでに対象サーバにデータを移してあり環境設定が済んでいる前提での紹介となります。

ディレクトリ構造

Serviceを追加するときに、プログラムのディレクトリ自体は/optの下に置くのがベターだと思われます。
また次に作るコマンドに関しては、わかりやすくPythonのプログラムがあるディレクトリにbinというディレクトリを新たに作って保存するのが良いです。

ざっと絶対パスを書いてみるとこんな感じになります。

ディレクトリ構造

┣ opt
┃  ┗ プログラムディレクトリ
┃    ┣ Pythonプログラム
┃    ┗ bin
┃      ┗ コマンド

コマンドを作る

まずはPythonプログラムを1つのコマンドで実行できるようにShellScriptを書きます。
といっても普段プログラムを実行するのとほとんど同じような内容です。

例えば、gunicornを使ってPython製APIサーバを立ち上げる場合。

start.sh
#!/bin/bash
exec /usr/local/bin/gunicorn --chdir Pythonのプログラムがあるディレクトリのパス 起動するPythonファイル:インスタンス

こんな感じに書きます。
保存先は、先ほど紹介したとおり/binの中です。

パーミッションを変更する

まずは、chownやchgrpを使って所有権とグループを適宜変更してください。

次に、先程作ったコマンドに実行パーミッションをつけましょう。

コマンド
sudo chmod 750 /opt/ディレクトリ/bin/start.sh

サービスを作る

さてここがメインになります。

パス
/etc/systemd/system/

このディレクトリに定義ファイルを作ります。

ファイル名
xxxxx.service
xxxxxには適当な名前を入れてください。

定義ファイル
[Unit]
Description=プログラムの内容説明

[Service]
Type=simple
ExecStart=先程つくったコマンドの絶対パス

[Install]
WantedBy=multi-user.target

最低限ですが、上のように書けば動きます。

他のオプション

  • Type=simple
  • After=local-fs.target
  • Documentation=プログラムのドキュメント先URLなど
  • Restart = always
  • User=起動するユーザ
  • Group=起動するグループ

更に詳しくオプションを書くこともできます、詳しくはこちらのサイトがとっても参考になります。
参考 serviceタイプUnitの設定ファイルhatenablog.com

実行する

ここでsystemctlのデーモンをリロードします。

systemctl
sudo systemctl daemon-reload

次に先程作ったコマンドが存在しているか確認してみてください。

systemctl
sudo systemctl list-unit-files --type=service | grep サービス名

確認が取れた場合は、有効化と起動をします。

systemctl
sudo systemctl enable サービス名.service
sudo systemctl start サービス名.service

最後に、ステータスの確認です。
ここでActiceの部分が緑でactiveになっていたら問題なく実行できています(もしかしたらそのまま白文字かもしれません)

systemctl
sudo systemctl status サービス名.service

ここで正常に実行されていない場合は下に出ているlogやシステムログを確認してみてください。

ディレクトリ
/var/log/syslog

一応再起動後も正常に実行できるか、実際に再起動を掛けてみましょう。

コマンド
sudo reboot

正常に実行されていたら問題なしです。

以上でサービスの登録が完了しました。

コメントを残す