나는 이것이 간단해야한다고 생각하지만 제대로 작동하지 못합니다.
다음은 명령 행에서 실행할 수있는 명령입니다.
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, 크로스바를위한 비 실행 파일 및 별도의 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
, 그래서 systemd 쉘 명령입니다 ExecStart=
또는 ExecStartPre=
… 직접 이해하지 못할 (BTW 동일 마찬가지입니다, cd
하고 &&
.)
당신은 수있는 명시 적으로 쉘을 실행하고 함께이 모든 명령을 실행하여 그것을 달성하기 :
ExecStart=/bin/sh -c 'cd /home/debian/ap/ && source venv-ap/bin/activate && crossbar start'
그러나 더 나은 접근 방법은 “activate”스크립트를 소싱하는 대신 virtualenv 의 python
실행 파일을 bin/
직접 사용하는 것입니다.
virtualenv의 사용법 문서 를 보면 다음과 같이 표시됩니다.
ENV/bin
실행 파일이 눈에 띄게 새로운 파이썬 으로 만들어지는 곳 입니다. 따라서 스크립트를#! /path/to/ENV/bin/python
실행하면이 virtualenv의 파이썬에서 해당 스크립트를 실행합니다.
즉, virtualenv crossbar
가 필요한 실행하려는 Python 스크립트 라고 가정하면 다음과 같이 venv-ap
시작 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
명령을 사용하는 것보다 낫습니다 . 그런 방식으로 쉘이 필요하지 않으며 systemd는 더 나은 오류 처리를 수행 할 수 있습니다.)