ฉันมีสคริปต์ที่ฉันเขียนที่ฟังบน mqtt
เมื่อรหัสบางอย่างมาถึงเซิร์ฟเวอร์ mqtt เซสชัน ngrok จะเริ่มต้นดังนี้:
subprocess.Popen(['/tmp/ngrok','http' ,'8080'], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
สแครปทำงานใน virtualenv และมีเชลล์สคริปต์เพื่อเปิดใช้งาน env เสมือนและรัน:
#!/bin/bash
. ./venv/bin/เปิดใช้งาน
หลาม mqtt_listener.py
เมื่อเรียกใช้สคริปต์นี้ในเชลล์ของฉันด้วย & ในตอนท้ายเซสชัน ngrok จะเปิดขึ้นและเปิดทิ้งไว้จนกว่าฉันจะฆ่ามันเอง
อย่างไรก็ตามเมื่อทำงานใน systemd โดยใช้ไฟล์ระบบต่อไปนี้ (ไฟล์ผู้ใช้)
/home/myuser/.config/systemd/user/mqtt_listener.service
[หน่วย]
Description=mqtt เรียกใช้บริการ
หลังจาก=default.target
[บริการ]
ประเภท=ผู้บริหาร
ExecStart=/home/myuser/mqtt_listener/run_mqtt_service.sh
KillMode=กระบวนการ
[ติดตั้ง]
ต้องการโดย=default.target
เมื่อบริการได้รับคำสั่ง mqtt ฉันสามารถเห็นบันทึกประจำวันที่บริการได้รับข้อความของฉันและแยกเป็นกระบวนการ ngrok แต่ฉันก็เห็น
บริการ "ปิดใช้งานสำเร็จ" แล้วเริ่มต้นใหม่
สิ่งที่แปลกคือมันมักจะเกิดขึ้นเมื่อฉันไม่ได้เข้าสู่ระบบโดยใช้ ssh กับเซิร์ฟเวอร์ ถ้าฉันเข้าสู่ระบบกระบวนการจะไม่ตาย
มีความคิดอะไรที่ฉันทำผิด? type=exec เกิดจากข้อเท็จจริงที่ว่าอันอื่นไม่พอดี ฉันไม่สามารถเข้าใจได้ว่าเหตุใด systemd จึงพิจารณาว่าบริการ python ของฉันเสร็จสิ้นและด้วยเหตุนี้จึงฆ่ามันหลังจากแยกหลาน (ส้อมแรกคือสคริปต์เรียกใช้ ฉันสามารถกำจัดได้)