Je crois que cela devrait être simple mais je ne peux pas le faire fonctionner correctement.
Ce sont les commandes que je peux exécuter en ligne de commande:
cd /home/debian/ap
# Start a virtualenv
source venv-ap/bin/activate
# This needs to happen inside the virtualenv and takes ~20 seconds
crossbar start
# Outside the virtualenv, perhaps in a different command line window
python3 /home/debian/myscript.py
Ces commandes doivent être exécutées dans cet ordre. En raison de virtualenv, du non-exécutable pour crossbar et du script python séparé par la suite, je n'ai pas été en mesure de trouver la meilleure façon de faire fonctionner cela. Mon travail en cours:
[Unit]
Description=Start CB
After=network.target
[Service]
Type=simple
User=debian
ExecStartPre=source /home/debian/ap/venv-ap/bin/activate
ExecStart=cd /home/debian/ap/ && crossbar start
Restart=always
[Install]
WantedBy=multi-user.target
systemd
python
python3
virtualenv
sscirrus
la source
la source
Réponses:
Cela ne fonctionne pas parce
source
est une commande shell, donc systemd deExecStart=
ouExecStartPre=
ne les comprendra pas directement ... (BTW, la même chose est vraie pourcd
et&&
.)Vous pouvez y parvenir en exécutant explicitement un shell et en exécutant toutes vos commandes ensemble là-bas:
Mais une meilleure approche consiste, au lieu de rechercher le script "activate", à utiliser l'
python
exécutablebin/
directement dans votre virtualenv.Si vous regardez le document d'utilisation de virtualenv , vous remarquerez qu'il dit:
En d'autres termes, en supposant que
crossbar
le script Python que vous souhaitez exécuter nécessite levenv-ap
virtualenv, commencez simplementcrossbar
par:Et il utilisera automatiquement virtualenv chaque fois qu'il sera invoqué.
Également possible, en invoquant directement l'interpréteur Python depuis virtualenv, avec:
(En outre, en ce qui concerne l'exécution dans un répertoire spécifique, le réglage
WorkingDirectory=/home/debian/ap
est meilleur que l'utilisation d'unecd
commande. Vous n'avez pas besoin d'un shell de cette façon, et systemd peut mieux gérer les erreurs pour vous.)la source