Tôi có một kịch bản tôi đã viết để nghe trên mqtt.
Khi một số mã nhất định đến máy chủ mqtt thì phiên ngrok sẽ được bắt đầu như sau:
sub process.Popen(['/tmp/ngrok','http' ,'8080'], stdout=sub process.DEVNULL, stderr=sub process.DEVNULL)
scrupt chạy trong virtualenv và ở đó có tập lệnh shell để kích hoạt env ảo và chạy nó:
#!/bin/bash
. ./venv/bin/kích hoạt
python mqtt_listener.py
Khi chạy tập lệnh này trong trình bao của tôi với & cuối cùng, phiên ngrok sẽ mở và để mở nicl cho đến khi tôi tự hủy nó.
Tuy nhiên, khi chạy trong systemd bằng tệp hệ thống sau (tệp người dùng)
/home/myuser/.config/systemd/user/mqtt_listener.service
[Đơn vị]
Mô tả=dịch vụ chạy mqtt
Sau=default.target
[Dịch vụ]
Loại = thực thi
ExecStart=/home/myuser/mqtt_listener/run_mqtt_service.sh
KillMode=tiến trình
[Cài đặt]
WantedBy=default.target
khi dịch vụ nhận được lệnh mqtt, tôi có thể xem nhật ký nhật ký, dịch vụ đã nhận được tin nhắn của tôi và rẽ nhánh, đó là quy trình ngrok, nhưng sau đó tôi có thể thấy
dịch vụ đã được "tắt kích hoạt thành công" và sau đó khởi động lại.
điều kỳ lạ là nó luôn xảy ra khi tôi không đăng nhập bằng ssh vào máy chủ, nếu tôi đăng nhập thì quá trình này sẽ không chết.
Bất cứ ý tưởng những gì tôi đang làm sai? type=exec là do thực tế là những cái khác không phù hợp. Tôi không thể hiểu tại sao systemd coi dịch vụ python của tôi đã hoàn thành và do đó giết nó sau một nhánh rẽ cháu (ngã ba đầu tiên là tập lệnh chạy, tập lệnh này tôi có thể thoát khỏi).