Systemd
如何使用 systemd 在 vi rtualenv 中執行命令
我相信這應該很簡單,但我無法讓它正常工作。
這些是我可以在命令行上執行的命令:
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'
但更好的方法是直接使用 virtualenv
python
中的執行檔,而不是採購“啟動”腳本。bin/
如果您查看 virtualenv 的使用文件,您會注意到它說:
ENV/bin
已創建,執行檔所在的位置 - 明顯是一個新的python。因此,執行一個腳本#! /path/to/ENV/bin/python
將在這個 virtualenv 的 python 下執行該腳本。換句話說,假設
crossbar
您要執行的 Python 腳本需要venv-ap
virtualenv,只需從以下內容開始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 可以為你做更好的錯誤處理。)