ทำไมยูนิต Systemd ของฉันโหลด แต่ไม่ทำงาน (ไม่ทำงาน)


29

ฉันกำลังพยายามตั้งค่าไฟท์บนเซิร์ฟเวอร์ของฉัน ฉันสามารถเริ่มภูตคาร์บอนแคชไม่มีปัญหาsudo /opt/graphite/bin/carbon-cache.py startแต่ฉันพยายามที่จะเรียกใช้เป็นหน่วย Systemd

นี่คือสิ่งที่ฉันมีในไฟล์บริการของฉันgraphite.service:

[Unit]
Description=Carbon for Graphite

[Service]
ExecStart=/opt/graphite/bin/carbon-cache.py start

[Install]
WantedBy=multi-user.target

แต่เมื่อฉันเริ่มหน่วยฉันได้รับสถานะต่อไปนี้:

$ systemctl status graphite.service            
* graphite.service - Carbon for Graphite
   Loaded: loaded (/etc/systemd/system/graphite.service; enabled)
   Active: inactive (dead) since Fri 2014-06-13 18:44:11 UTC; 2s ago
  Process: 4525 ExecStart=/opt/graphite/bin/carbon-cache.py start (code=exited, status=0/SUCCESS)
 Main PID: 4525 (code=exited, status=0/SUCCESS)

Jun 13 18:44:11 MEADOW systemd[1]: Started Carbon for Graphite.

Journalctl ไม่ได้ให้ข้อมูลเพิ่มเติม

ฉันจะตีความและแก้ปัญหาหน่วยที่มีสถานะ "ไม่ได้ใช้งาน (ตายแล้ว) ... (รหัส = ออกจากสถานะ = 0 / สำเร็จ)" ฉันเคยเห็นยูนิตที่ล้มเหลวมาก่อน แต่เครื่องนี้โหลดได้สำเร็จ แต่ยังไม่ทำงานและฉันไม่รู้ว่ามันแปลว่าอะไร


4
หมายความว่า systemd ทำงานเสร็จแล้ว ไม่ควรมีType=ตัวเลือกหรือไม่? ดูman systemd.serviceประเภทที่เหมาะสม
jasonwryan

1
นั่นทำให้รู้สึก สิ่งที่ฉันต้องทำคือเพิ่มType=forkingไปยัง[Service]ส่วน
Ryne Everett

คำตอบ:


26

ตามความคิดเห็นของ jasonwryan ในขณะที่ค่าเริ่มต้นใช้Type=simpleงานได้กับไฟล์บริการ Systemd จำนวนมากมันไม่ทำงานเมื่อสคริปต์ในการExecStartเปิดตัวกระบวนการอื่นและดำเนินการให้เสร็จสมบูรณ์ดังเช่นกรณีที่มี carbon-cache.py ของกราไฟท์ ในกรณีเหล่านี้คุณต้องระบุอย่างชัดเจนType=forkingใน[Service]ส่วนเพื่อให้ Systemd รู้ที่จะดูกระบวนการที่เกิดขึ้นแทนที่จะเป็นกระบวนการเริ่มต้น

ตามที่อธิบายไว้ในman systemd.service:

หากตั้งค่าเป็นฟอร์กกิ้งคาดว่ากระบวนการที่กำหนดค่าด้วย ExecStart = จะเรียก fork () เป็นส่วนหนึ่งของการเริ่มทำงาน คาดว่ากระบวนการหลักจะจบการทำงานเมื่อการเริ่มต้นเสร็จสมบูรณ์และมีการตั้งค่าช่องทางการสื่อสารทั้งหมด ชายด์ยังคงรันเป็นกระบวนการ daemon หลัก นี่คือพฤติกรรมของ daemons UNIX แบบดั้งเดิม หากใช้การตั้งค่านี้ขอแนะนำให้ใช้ตัวเลือก PIDFile = เพื่อให้ systemd สามารถระบุกระบวนการหลักของ daemon systemd จะดำเนินการกับการเริ่มต้นหน่วยติดตามผลทันทีที่กระบวนการหลักจบการทำงาน

คำตอบเฉพาะกราไฟท์

ในขณะที่การแก้ไขปัญหาดังกล่าวข้างต้น Systemd ของฉันฉันรีบวิ่งเข้าไปในปัญหาไฟท์เฉพาะ (กับบิด) Typeและจบลงด้วยการที่จะกลับไปเริ่มต้น

กราไฟท์ <0.9.12

ใน Graphite รุ่นก่อนหน้าหนึ่งสามารถหลีกเลี่ยงการฟอร์กโดยใช้--debugตัวเลือก:

[Service]
ExecStart=/opt/graphite/bin/carbon-cache.py --debug start

กราไฟท์> = 0.9.13

ในคำขอดึงนี้มีการ--no-daemonรวมตัวเลือก:

[Service]
ExecStart=/opt/graphite/bin/carbon-cache.py --no-daemon start
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.