web-dev-qa-db-fra.com

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

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)
11
Jasmine

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 python binaire 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 ressort, c'est la raison pour laquelle votre appareil tombe en panne: 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, regardez 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 options [Service] 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_file Et le second un fichier /home/user/space/my_file.

14
Daniel