Systemd: eseguire uno script Python all'avvio (virtualenv)


11

Ho uno script Python che normalmente lo eseguo con questo comando:

(environment) python run.py

Voglio eseguire questo script all'inizio. (Sto usando Ubuntu) Ecco il mio servizio:

[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

A proposito, non ho potuto eseguire questo script, ma ho potuto eseguire qualsiasi script che non sia all'interno dell'ambiente. Come posso eseguire uno script Python all'avvio (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)

1
Cosa dicono i registri e lo stato?
Federico Sierra,

Ho modificato la mia domanda. Mille grazie @FedericoSierra
Jasmine,

1
Lo script è runnig venv esterno, /usr/bin/python run.pyvedere stackoverflow.com/questions/37211115/... e unix.stackexchange.com/questions/278188/...
Federico Sierra

Li ho provati. Devo eseguire "python run.py" non "python /user_sent/run.py"
Jasmine,

1
Il percorso pitone deve puntare alla versione all'interno dell'ambiente virtuale, Eg/path/to/your/virtualenv/bin/python
Federico Sierra

Risposte:


14

Il file dell'unità è corretto. Se vuoi eseguire qualsiasi file Python sotto un Venv, devi solo fare riferimento al binario Python nella directory Venv come hai fatto con/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

Ciò che sporge è la ragione per la vostra unità non riesce: code=exited, status=200/CHDIR. Questo molto probabilmente indica un problema all'interno del tuo script.

Se si desidera eseguire il debug di questo, si dovrebbe fare quanto segue:

  1. Esegui il comando che hai aggiunto ExecStart=esattamente come quello in root per vedere se il problema è causato dal tuo script.
  2. Se funziona senza errori, guarda il diario con journalctl -u <unit_name>. Questo dovrebbe darti qualche informazione in più sui problemi con la tua unità.

Post scriptum

Entrambe le seguenti [Service]opzioni funzionano:

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

o

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

L'unica differenza è che le chiamate relative nello script vengono eseguite da directory diverse. Quindi se il tuo script contiene una riga open("my_file", "w"), nel primo esempio creerebbe un file /my_filee il secondo un file /home/user/space/my_file.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.