如何使用systemd在virtualenv中运行命令


15

我认为这应该很简单,但我无法使其正常工作。

这些是我可以在命令行上运行的命令:

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

这些命令必须按此顺序完成。由于virtualenv,crossbar的非可执行性以及之后的单独python脚本,因此我无法找出使此功能正常工作的最佳方法。我目前正在进行的工作:

[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

1
你能解决吗?如果是这样,怎么办?
黑色

Answers:


11

这是行不通的,因为它source是一个shell命令,因此systemd会ExecStart=ExecStartPre=不会直接理解它们……(顺便说一句,cd和也是一样&&。)

可以通过显式运行shell并在其中同时运行所有命令实现:

ExecStart=/bin/sh -c 'cd /home/debian/ap/ && source venv-ap/bin/activate && crossbar start'

但是,更好的方法是直接使用virtualenv中的python可执行文件,而不是购买“激活”脚本bin/

如果查看virtualenv的使用文档,您会发现它说:

ENV/bin创建了可执行文件并在其中运行-显然是一个新的python。因此,使用运行脚本#! /path/to/ENV/bin/python将在virtualenv的python下运行该脚本。

换句话说,假设crossbar您要运行的Python脚本需要venv-apvirtualenv,只需开始crossbar

#!/home/debian/ap/venv-ap/bin/python

并且每次调用时它将自动使用virtualenv。

也可以通过以下命令直接从virtualenv调用Python解释器:

ExecStart=/home/debian/ap/venv-ap/bin/python /path/to/crossbar start

(此外,对于在特定目录中运行,设置WorkingDirectory=/home/debian/ap要比使用cd命令更好。您不需要那种shell,systemd可以为您提供更好的错误处理。)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.