PythonとWSGIなどを使ってAPIサーバを立ち上げたりなど、常時Pythonプログラム起動させておきたい場面がちょくちょく発生します。
今回はUbuntu環境でPythonプログラムをSystemctlに登録する方法を紹介します。
ディレクトリ構造
Serviceを追加するときに、プログラムのディレクトリ自体は/optの下に置くのがベターだと思われます。
また次に作るコマンドに関しては、わかりやすくPythonのプログラムがあるディレクトリにbinというディレクトリを新たに作って保存するのが良いです。
ざっと絶対パスを書いてみるとこんな感じになります。
┣ opt
┃ ┗ プログラムディレクトリ
┃ ┣ Pythonプログラム
┃ ┗ bin
┃ ┗ コマンド
コマンドを作る
まずはPythonプログラムを1つのコマンドで実行できるようにShellScriptを書きます。
といっても普段プログラムを実行するのとほとんど同じような内容です。
例えば、gunicornを使ってPython製APIサーバを立ち上げる場合。
#!/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
[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のデーモンをリロードします。
sudo systemctl daemon-reload
次に先程作ったコマンドが存在しているか確認してみてください。
sudo systemctl list-unit-files --type=service | grep サービス名
確認が取れた場合は、有効化と起動をします。
sudo systemctl enable サービス名.service
sudo systemctl start サービス名.service
最後に、ステータスの確認です。
ここでActiceの部分が緑でactiveになっていたら問題なく実行できています(もしかしたらそのまま白文字かもしれません)
sudo systemctl status サービス名.service
ここで正常に実行されていない場合は下に出ているlogやシステムログを確認してみてください。
/var/log/syslog
一応再起動後も正常に実行できるか、実際に再起動を掛けてみましょう。
sudo reboot
正常に実行されていたら問題なしです。
以上でサービスの登録が完了しました。
コメントを残す