web-dev-qa-db-ja.com

Systemd:Python起動時にスクリプトを実行(virtualenv)

私はpythonスクリプトを持っていますが、通常は次のコマンドで実行します:

(environment) python run.py

最初にこのスクリプトを実行したいと思います。 (ubuntuを使用しています)これが私のサービスです。

[Unit]
Description=My Script Service
After=multi-user.target

[Service]
Type=idle

ExecStart=/home/user/anaconda3/bin/python /home/user/space/run.py

[Install]
WantedBy=multi-user.target

ところで、このスクリプトは実行できませんでしたが、環境内にないスクリプトはすべて実行できました。起動時にpythonスクリプトを実行するにはどうすればよいですか(virtualenv)?

Sudo systemctl status user_sent
● user_sent.service - Mail Service
Loaded: loaded (/lib/systemd/system/user_sent.service; enabled; vendor preset: enabled)
Active: failed (Result: exit-code) since xxxxx 16:30:20 MSK; 3s ago
Process: 3713 ExecStart=/usr/bin/python run.py (code=exited,   status=200/CHDIR)
Main PID: 3713 (code=exited, status=200/CHDIR)
11
Jasmine

ユニットファイルは正しいです。 pythonファイルをvenvの下で実行したい場合は、pythonバイナリを参照するだけで_/home/user/anaconda3/bin/python_で行ったようなvenvディレクトリ

_[Unit]
Description=My Script Service
After=multi-user.target

[Service]
Type=idle

ExecStart=/home/user/anaconda3/bin/python /home/user/space/run.py

[Install]
WantedBy=multi-user.target
_

突き出ているのは、ユニットが故障した理由です:_code=exited, status=200/CHDIR_。これはおそらく、スクリプト内の問題を示しています。

これをデバッグする場合は、次のようにします。

  1. ルートにあるのとまったく同じように_ExecStart=_に追加したコマンドを実行して、問題がスクリプトによって引き起こされているかどうかを確認します。
  2. エラーなしで実行された場合は、_journalctl -u <unit_name>_でジャーナルを確認してください。これで、ユニットに関する問題の詳細がわかります。

投稿スクリプト

次の_[Service]_オプションは両方とも機能します。

_ExecStart=/home/user/anaconda3/bin/python /home/user/space/run.py
_

または

_WorkingDirectory=/home/user/space
ExecStart=/home/user/anaconda3/bin/python run.py
_

唯一の違いは、スクリプト内の相対呼び出しが異なるディレクトリから実行されることです。したがって、スクリプトにopen("my_file", "w")という行が含まれている場合、最初の例ではファイル_/my_file_を作成し、2番目のファイルでは_/home/user/space/my_file_ファイルを作成します。

14
Daniel