Systemd

如何使用 systemd 在 vi rtualenv 中執行命令

  • March 25, 2022

我相信這應該很簡單,但我無法讓它正常工作。

這些是我可以在命令行上執行的命令:

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

這不起作用,因為source它是一個 shell 命令,所以 systemdExecStart=或者ExecStartPre=不會直接理解它們……(順便說一句,對於cd和也是如此&&。)

可以通過顯式執行 shell 並在那裡一起執行所有命令來實現這一點:

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

但更好的方法是直接使用 virtualenvpython中的執行檔,而不是採購“啟動”腳本。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 可以為你做更好的錯誤處理。)

引用自:https://unix.stackexchange.com/questions/409609