Systemd: ejecutar un script de Python al inicio (virtualenv)

11

Tengo un script de Python que normalmente lo ejecuto con este comando:

(environment) python run.py

Quiero ejecutar este script al inicio. (Estoy usando ubuntu) Aquí está mi servicio:

[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

Por cierto, no pude ejecutar este script, pero podría ejecutar cualquier script que no esté dentro del entorno. ¿Cómo puedo ejecutar un script de Python al inicio (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)
Jazmín
fuente
1
¿Qué dicen los registros y el estado?
Federico Sierra
He editado mi pregunta. Muchas gracias @FedericoSierra
Jasmine
1
El script se ejecuta fuera de venv, /usr/bin/python run.pyconsulte stackoverflow.com/questions/37211115/… y unix.stackexchange.com/questions/278188/…
Federico Sierra
Los probé. Tengo que ejecutar "python run.py" no "python /user_sent/run.py"
Jasmine
1
La ruta de Python debe apuntar a la versión dentro del entorno virtual, por ejemplo/path/to/your/virtualenv/bin/python
Federico Sierra

Respuestas:

14

Su archivo de unidad es correcto. Si desea ejecutar cualquier archivo python en un venv , solo necesita hacer referencia al binario de python en el directorio venv como lo hizo 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

Lo que sobresale es la razón por la que su unidad no: code=exited, status=200/CHDIR. Esto probablemente indica un problema dentro de su script.

Si desea depurar eso, haría lo siguiente:

  1. Ejecute el comando que agregó ExecStart=exactamente así en la raíz para ver si el problema es causado por su script.
  2. Si eso se ejecuta sin errores, mira el diario con journalctl -u <unit_name>. Eso debería darle más información sobre los problemas con su unidad.

Post Scriptum

Las dos [Service]opciones siguientes funcionan:

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

o

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

La única diferencia es que las llamadas relativas en su script se ejecutan desde diferentes directorios. Entonces, si su script contiene una línea open("my_file", "w"), en el primer ejemplo crearía un archivo /my_filey el segundo un archivo /home/user/space/my_file.

Daniel
fuente