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, 크로스바를위한 비 실행 파일 및 별도의 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
아직 해결할 수 있습니까? 그렇다면 어떻게?
검은

답변:


11

때문에 일을하지 않는 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/apcd명령을 사용하는 것보다 낫습니다 . 그런 방식으로 쉘이 필요하지 않으며 systemd는 더 나은 오류 처리를 수행 할 수 있습니다.)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.