Systemd: Uruchom skrypt Python podczas uruchamiania (virtualenv)

11

Mam skrypt Pythona, który normalnie uruchamiam za pomocą tego polecenia:

(environment) python run.py

Chcę uruchomić ten skrypt na początku. (Używam ubuntu) Oto moja usługa:

[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

BTW, nie mogłem uruchomić tego skryptu, ale mogłem uruchomić dowolny skrypt, który nie znajduje się w środowisku. Jak mogę uruchomić skrypt Pythona podczas uruchamiania (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)
Jaśmin
źródło
1
Co mówią logi i status?
Federico Sierra,
Zredagowałem swoje pytanie. Wielkie dzięki @FedericoSierra
Jasmine
1
Skrypt jest uruchamiany poza venv, /usr/bin/python run.pypatrz stackoverflow.com/questions/37211115/... i unix.stackexchange.com/questions/278188/...
Federico Sierra
Próbowałem ich. Muszę uruchomić „python run.py”, a nie „python /user_sent/run.py”
Jasmine,
1
Ścieżka python musi wskazywać wersji wewnątrz wirtualnego środowiska, Eg/path/to/your/virtualenv/bin/python
Federico Sierra

Odpowiedzi:

14

Twój plik jednostki jest poprawny. Jeśli chcesz uruchomić dowolny plik Pythona w pliku Venv, musisz po prostu odwołać się do pliku binarnego Pythona w katalogu Venv, tak jak zrobiłeś to z/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

Co rzuca się w oczy jest powodem jednostka nie: code=exited, status=200/CHDIR. To najprawdopodobniej oznacza problem w twoim skrypcie.

Jeśli chcesz to debugować, wykonaj następujące czynności:

  1. Uruchom komendę, którą dodałeś ExecStart=dokładnie w katalogu root, aby sprawdzić, czy przyczyną problemu jest skrypt.
  2. Jeśli działa to bezbłędnie, spójrz na dziennik za pomocą journalctl -u <unit_name>. To powinno dać ci więcej informacji na temat problemów z twoim urządzeniem.

Post Scriptum

Obie następujące [Service]opcje działają:

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

lub

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

Jedyną różnicą jest to, że względne wywołania w skrypcie są uruchamiane z różnych katalogów. Jeśli więc skrypt zawiera wiersz open("my_file", "w"), w pierwszym przykładzie utworzy plik, /my_filea drugi plik /home/user/space/my_file.

Daniel
źródło