Systemd: exécuter un script Python au démarrage (virtualenv)

11

J'ai un script python que je lance normalement avec cette commande:

(environment) python run.py

Je veux exécuter ce script au démarrage. (J'utilise ubuntu) Voici mon 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

BTW, je ne pouvais pas exécuter ce script, mais je pouvais exécuter n'importe quel script qui n'est pas dans l'environnement. Comment puis-je exécuter un script python au démarrage (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
la source
1
Que disent les journaux et le statut?
Federico Sierra
J'ai édité ma question. Merci beaucoup @FedericoSierra
Jasmine
1
Le script est exécuté en dehors de venv, /usr/bin/python run.pyvoir stackoverflow.com/questions/37211115/… et unix.stackexchange.com/questions/278188/…
Federico Sierra
Je les ai essayés. Je dois exécuter "python run.py" et non "python /user_sent/run.py"
Jasmine
1
Le chemin python doit pointer vers la version à l'intérieur de l'environnement virtuel, par exemple/path/to/your/virtualenv/bin/python
Federico Sierra

Réponses:

14

Votre fichier d'unité est correct. Si vous souhaitez exécuter un fichier python sous un venv, il vous suffit de référencer le binaire python dans le répertoire venv comme vous l'avez fait avec/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

Ce qui dépasse est la raison pour laquelle votre appareil échoue: code=exited, status=200/CHDIR. Cela indique très probablement un problème dans votre script.

Si vous souhaitez déboguer cela, vous devez procéder comme suit:

  1. Exécutez la commande que vous avez ajoutée ExecStart=exactement comme cela sous root pour voir si le problème est dû à votre script.
  2. Si cela fonctionne sans erreur, consultez le journal avec journalctl -u <unit_name>. Cela devrait vous donner plus d'informations sur les problèmes avec votre appareil.

Post Scriptum

Les deux [Service]options suivantes fonctionnent:

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

ou

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

La seule différence est que les appels relatifs dans votre script s'exécutent à partir de différents répertoires. Donc, si votre script contient une ligne open("my_file", "w"), dans le premier exemple, il créerait un fichier /my_fileet le second un fichier /home/user/space/my_file.

Daniel
la source