Cách chạy lệnh bên trong virtualenv bằng systemd


15

Tôi tin rằng điều này sẽ đơn giản nhưng tôi không thể làm cho nó hoạt động đúng.

Đây là những lệnh tôi có thể chạy trên dòng lệnh:

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

Các lệnh này phải được thực hiện theo thứ tự này. Do virtualenv, không thể thực thi cho thanh ngang và tập lệnh python riêng biệt sau đó, tôi đã không thể tìm ra cách tốt nhất để làm cho nó hoạt động. Công việc hiện tại của tôi đang tiến hành:

[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
Bạn có thể giải quyết nó chưa? Nếu vậy thì thế nào?
đen

Câu trả lời:


11

Điều này không hoạt động vì sourcelà một lệnh shell, vì vậy systemd ExecStart=hoặc ExecStartPre=sẽ không hiểu chúng trực tiếp ... (BTW, điều tương tự cũng đúng với cd&&.)

Bạn có thể đạt được điều đó bằng cách chạy shell một cách rõ ràng và chạy tất cả các lệnh của bạn với nhau ở đó:

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

Nhưng một cách tiếp cận tốt hơn là, thay vì tìm nguồn cung cấp kịch bản "kích hoạt", để sử dụng trực tiếp pythontệp thực thi trong bin/virtualenv của bạn.

Nếu bạn xem tài liệu sử dụng của virtualenv , bạn sẽ thấy nó nói:

ENV/binđược tạo ra, nơi thực thi trực tiếp - đáng chú ý là một con trăn mới . Do đó, chạy một tập lệnh #! /path/to/ENV/bin/pythonsẽ chạy tập lệnh đó theo python của virtualenv này.

Nói cách khác, giả sử crossbarlà tập lệnh Python mà bạn muốn chạy yêu cầu venv-apvirtualenv, chỉ cần bắt đầu crossbarbằng:

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

Và nó sẽ tự động sử dụng virtualenv bất cứ khi nào được gọi.

Cũng có thể, gọi trình thông dịch Python trực tiếp từ virtualenv, với:

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

(Ngoài ra, liên quan đến việc chạy trong một thư mục cụ thể, cài đặt WorkingDirectory=/home/debian/apsẽ tốt hơn so với sử dụng cdlệnh. Bạn không cần trình bao theo cách đó và systemd có thể xử lý lỗi tốt hơn cho bạn.)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.