วิธีรันคำสั่งภายใน virtualenv โดยใช้ systemd


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
คุณสามารถแก้มันได้หรือยัง ถ้าเป็นเช่นนั้นได้อย่างไร
ดำ

คำตอบ:


11

สิ่งนี้ไม่ทำงานเพราะsourceเป็นคำสั่งเชลล์ดังนั้น systemd's ExecStart=หรือExecStartPre=จะไม่เข้าใจพวกเขาโดยตรง ... (BTW เดียวกันเป็นจริงสำหรับcdและ&&.)

คุณสามารถบรรลุเป้าหมายนั้นได้โดยการรันเชลล์อย่างชัดเจนและรันคำสั่งทั้งหมดของคุณร่วมกันที่นั่น:

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

แต่แนวทางที่ดีกว่าคือแทนที่จะใช้สคริปต์ "เปิดใช้งาน" เพื่อใช้pythonปฏิบัติการในbin/virtualenv ของคุณโดยตรง

หากคุณดูเอกสารการใช้งานของ virtualenv คุณจะสังเกตเห็นได้ว่า:

ENV/binถูกสร้างขึ้นที่ executables อาศัยอยู่ - อย่างเห็นได้ชัดใหม่หลาม ดังนั้นการเรียกใช้สคริปต์ด้วย#! /path/to/ENV/bin/pythonจะเรียกใช้สคริปต์นั้นภายใต้หลาม virtualenv นี้

กล่าวอีกนัยหนึ่งcrossbarคือสมมติว่าเป็นสคริปต์ Python ที่คุณต้องการเรียกใช้ที่ต้องการvenv-apvirtualenv เพียงแค่เริ่มต้นcrossbarด้วย:

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

และมันจะใช้ virtualenv โดยอัตโนมัติเมื่อใดก็ตามที่เรียกใช้

มีความเป็นไปได้ที่จะเรียกใช้ Python interpreter จาก virtualenv โดยตรงด้วย:

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

(เช่นเดียวกับการทำงานในไดเรกทอรีที่เฉพาะเจาะจงการตั้งค่าWorkingDirectory=/home/debian/apดีกว่าการใช้cdคำสั่งคุณไม่ต้องการเชลล์ในแบบนั้นและ systemd สามารถจัดการข้อผิดพลาดได้ดีขึ้นสำหรับคุณ)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.