Systemd: Führen Sie beim Start ein Python-Skript aus (virtualenv)

11

Ich habe ein Python-Skript, das ich normalerweise mit diesem Befehl ausführe:

(environment) python run.py

Ich möchte dieses Skript beim Start ausführen. (Ich benutze Ubuntu) Hier ist mein Service:

[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

Übrigens konnte ich dieses Skript nicht ausführen, aber ich konnte jedes Skript ausführen, das sich nicht in der Umgebung befindet. Wie kann ich beim Start ein Python-Skript ausführen (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)
Jasmin
quelle
1
Was sagen Protokolle und Status?
Federico Sierra
Ich habe meine Frage bearbeitet. Vielen Dank @FedericoSierra
Jasmine
1
Das Skript wird außerhalb von venv ausgeführt, /usr/bin/python run.pysiehe stackoverflow.com/questions/37211115/… und unix.stackexchange.com/questions/278188/…
Federico Sierra
Ich habe sie ausprobiert. Ich muss "python run.py" ausführen, nicht "python /user_sent/run.py"
Jasmine
1
Der Python - Pfad muss in virtueller Umgebung auf Version verweisen, Eg/path/to/your/virtualenv/bin/python
Federico Sierra

Antworten:

14

Ihre Gerätedatei ist korrekt. Wenn Sie eine Python-Datei unter einem venv ausführen möchten, müssen Sie nur auf die Python-Binärdatei im venv- Verzeichnis verweisen, wie Sie es getan haben/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

Was auffällt, ist der Grund, warum Ihr Gerät ausfällt : code=exited, status=200/CHDIR. Dies weist höchstwahrscheinlich auf ein Problem in Ihrem Skript hin.

Wenn Sie das debuggen möchten, gehen Sie wie folgt vor:

  1. Führen Sie den Befehl, den Sie hinzugefügt haben, ExecStart=genau so unter root aus, um festzustellen, ob das Problem durch Ihr Skript verursacht wird.
  2. Wenn das fehlerfrei läuft, schauen Sie sich das Journal mit an journalctl -u <unit_name>. Das sollte Ihnen weitere Informationen zu Problemen mit Ihrem Gerät geben.

Post Scriptum

Beide der folgenden [Service]Optionen funktionieren:

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

oder

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

Der einzige Unterschied besteht darin, dass relative Aufrufe in Ihrem Skript aus verschiedenen Verzeichnissen ausgeführt werden. Wenn Ihr Skript also eine Zeile enthält open("my_file", "w"), wird im ersten Beispiel eine Datei /my_fileund im zweiten eine Datei erstellt /home/user/space/my_file.

Daniel
quelle