【要約】systemd user で Python venv を呼ぶ書き方、4 通り試して残った 1 つ [Zenn_Python] | Summary by TechDistill
> Source: Zenn_Python
Execute Primary Source
// Problem
筆者が Raspberry Pi で複数プロジェクトを運用する際、systemd への移行に伴う環境管理に苦慮した。従来の cron 運用ではシェルスクリプトで環境を整えられたが、systemd ユニットでは以下の問題が発生した。
- ・ExecStartPre で環境変数を変更しても、後続の ExecStart プロセスに引き継がれない。
- ・bash -c を使用すると、クォートの管理が複雑化し、設定ミスを誘発しやすい。
- ・EnvironmentFile で PATH を手動管理すると、ディレクトリ移動時のメンテナンス負荷が高い。
// Approach
筆者は 4 つの手法を比較検討し、venv 内の Python インタプリタを絶対パスで直接実行する手法を採用した。
- ・ExecStart に
.venv/bin/python3の絶対パスを記述する。 - ・WorkingDirectory を適切に設定し、相対パスによる実行エラーを回避する。
- ・ExecStartPre で
python3 -c "import sys; sys.exit(0)"を実行し、venv の破損を事前に検知する。
// Result
この手法により、設定ファイルの簡素化と運用管理の効率化を実現した。
- ・
grepを用いて、ユニットファイルと venv の依存関係を即座に特定できるようになった。 - ・
systemd-analyze verifyによる、ユニットファイルの単独検証が可能になった。 - ・シンボリックリンク切れなどの環境破損を、実行前に検知してエラーログに残せるようになった。
Senior Engineer Insight
> 「activate は必須」という誤解を解き、Python の内部動作に基づいた設計を行っている点が優秀だ。シェルを介在させないことで、環境変数の伝播ミスやクォートの罠を排除している。また、ExecStartPre による健全性チェックは、SDカードの劣化等が発生しやすいエッジデバイス運用において極めて実践的な防衛策と言える。運用コストと信頼性のバランスが非常に高い。