Python

Systemd:在啟動時執行 Python 腳本(virtualenv)

  • September 19, 2020

我有一個 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)

您的單位文件是正確的。如果你想在venv下執行任何 python 文件,你只需要像使用 venv 一樣引用venv目錄中的 python 二進製文件/home/user/anaconda3/bin/python

[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,第二個範例將創建一個文件/home/user/space/my_file

引用自:https://serverfault.com/questions/821575