Systemd: Chạy Python Script khi khởi động (virtualenv)


11

Tôi có một kịch bản python mà tôi thường chạy nó bằng lệnh này:

(environment) python run.py

Tôi muốn chạy kịch bản này khi bắt đầu. (Tôi đang sử dụng Ubuntu) Đây là dịch vụ của tôi:

[Unit]
Description=My Script Service
After=multi-user.target

[Service]
Type=idle

ExecStart=/home/user/anaconda3/bin/python /home/user/space/run.py

[Install]
WantedBy=multi-user.target

BTW, tôi không thể chạy tập lệnh này, nhưng tôi có thể chạy bất kỳ tập lệnh nào không nằm trong môi trường. Làm thế nào tôi có thể chạy một kịch bản python khi khởi động (virtualenv)?

sudo systemctl status user_sent
● user_sent.service - Mail Service
Loaded: loaded (/lib/systemd/system/user_sent.service; enabled; vendor preset: enabled)
Active: failed (Result: exit-code) since xxxxx 16:30:20 MSK; 3s ago
Process: 3713 ExecStart=/usr/bin/python run.py (code=exited,   status=200/CHDIR)
Main PID: 3713 (code=exited, status=200/CHDIR)

1
Điều gì nói nhật ký và trạng thái?
Federico Sierra

Tôi đã chỉnh sửa câu hỏi của tôi. Rất cám ơn @FedericoSierra
Jasmine

1
Kịch bản là runnig bên ngoài venv, /usr/bin/python run.pyxem stackoverflow.com/questions/37211115/ triệt
Federico Sierra

Tôi đã thử chúng. Tôi phải chạy "python run.py" chứ không phải "python /user_sent/run.py"
Jasmine

1
Đường dẫn python phải trỏ đến phiên bản trong môi trường ảo, vd/path/to/your/virtualenv/bin/python
Federico Sierra

Câu trả lời:


14

Tập tin đơn vị của bạn là chính xác. Nếu bạn muốn chạy bất kỳ tệp python nào dưới venv, bạn chỉ cần tham chiếu nhị phân python trong thư mục venv như bạn đã làm với/home/user/anaconda3/bin/python

[Unit]
Description=My Script Service
After=multi-user.target

[Service]
Type=idle

ExecStart=/home/user/anaconda3/bin/python /home/user/space/run.py

[Install]
WantedBy=multi-user.target

Những gì gậy ra là lý do đơn vị của bạn thất bại : code=exited, status=200/CHDIR. Điều này rất có thể chỉ ra một vấn đề trong kịch bản của bạn.

Nếu bạn muốn gỡ lỗi điều đó, bạn sẽ làm như sau:

  1. Chạy lệnh bạn đã thêm vào ExecStart=chính xác như thế dưới root để xem, nếu vấn đề là do tập lệnh của bạn gây ra.
  2. Nếu nó chạy mà không có lỗi, hãy xem tạp chí với journalctl -u <unit_name>. Điều đó sẽ cung cấp cho bạn thêm một số thông tin về các vấn đề với đơn vị của bạn.

Đoạn tái bút

Cả hai [Service]tùy chọn sau đều hoạt động:

ExecStart=/home/user/anaconda3/bin/python /home/user/space/run.py

hoặc là

WorkingDirectory=/home/user/space
ExecStart=/home/user/anaconda3/bin/python run.py

Sự khác biệt duy nhất là các cuộc gọi tương đối trong tập lệnh của bạn chạy từ các thư mục khác nhau. Vì vậy, nếu tập lệnh của bạn chứa một dòng open("my_file", "w"), trong ví dụ đầu tiên, nó sẽ tạo một tệp /my_filevà tệp thứ hai /home/user/space/my_file.

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.