จะเริ่มต้นและหยุดยูนิต systemd ด้วยยูนิตอื่นได้อย่างไร?


20

ฉันใช้ CoreOS เพื่อจัดตาราง systemd units กับกองยาน ฉันมีสองหน่วย ( firehose.serviceและfirehose-announce.service. ฉันพยายามที่firehose-announce.serviceจะเริ่มต้นและหยุดพร้อมกับfirehose.service. นี่คือไฟล์หน่วยสำหรับfirehose-announce.service:

[Unit]
Description=Firehose etcd announcer
BindsTo=firehose@%i.service
After=firehose@%i.service
Requires=firehose@%i.service

[Service]
EnvironmentFile=/etc/environment
TimeoutStartSec=30s
ExecStartPre=/bin/sh -c 'sleep 1'
ExecStart=/bin/sh -c "port=$(docker inspect -f '{{range $i, $e := .NetworkSettings.Ports }}{{$p := index $e 0}}{{$p.HostPort}}{{end}}' firehose-%i); echo -n \"Adding socket $COREOS_PRIVATE_IPV4:$port/tcp to /firehose/upstream/firehose-%i\"; while netstat -lnt | grep :$port >/dev/null; do etcdctl set /firehose/upstream/firehose-%i $COREOS_PRIVATE_IPV4:$port --ttl 300 >/dev/null; sleep 200; done"
RestartSec=30s
Restart=on-failure

[X-Fleet]
X-ConditionMachineOf=firehose@%i.service

ฉันกำลังพยายามที่จะใช้BindsToกับความคิดที่ว่าเริ่มต้นและหยุดยังจะเริ่มต้นหรือหยุดfirehose.service firehose-announce.serviceแต่สิ่งนี้ไม่เคยเกิดขึ้นอย่างถูกต้อง หากfirehose.serviceหยุดทำงานจากนั้นfirehose-announce.serviceไปที่สถานะล้มเหลว แต่เมื่อฉันเริ่มต้นfirehose.serviceสิ่งที่firehose-announce.serviceไม่เริ่มต้นขึ้น

ฉันทำอะไรผิดที่นี่


ปัญหาเดียวกันที่นี่ คุณพบวิธีแก้ปัญหาหรือไม่?
nahime

คำตอบ:


24

ในที่สุดฉันก็ดูเหมือนจะสะดุดกับชุดค่าผสมที่ถูกต้องเพื่อให้การทำงานนี้เป็นไปตามที่ต้องการ

ในของฉันหน่วยผมตั้งเพียงfirehose-announce.service BindsToหน่วยทั้งหมดคือ:

[Unit]
Description=Firehose etcd announcer
BindsTo=firehose@%i.service

[Service]
EnvironmentFile=/etc/environment
TimeoutStartSec=30s
ExecStartPre=/bin/sh -c 'sleep 1'
ExecStart=/bin/sh -c "port=$(docker inspect -f '{{range $i, $e := .NetworkSettings.Ports }}{{$p := index $e 0}}{{$p.HostPort}}{{end}}' firehose-%i); echo -n \"Adding socket $COREOS_PRIVATE_IPV4:$port/tcp to /firehose/upstream/firehose-%i\"; while netstat -lnt | grep :$port >/dev/null; do etcdctl set /firehose/upstream/firehose-%i $COREOS_PRIVATE_IPV4:$port --ttl 300 >/dev/null; sleep 200; done"
RestartSec=30s
Restart=on-failure

[X-Fleet]
X-ConditionMachineOf=firehose@%i.service

สิ่งนี้จะทำให้firehose-announce.serviceเครื่องหยุดเมื่อfirehose.serviceใด ยิ่งใหญ่ แต่เราจะเริ่มต้นใหม่ได้อย่างไร

ฉันกลับการพึ่งพาอาศัยอยู่ในfirehose.serviceหน่วยของฉันเช่น:

[Unit]
Description=Firehose server
Wants=firehose-announce@%i.service
Before=firehose-announce@%i.service

[Service]
ExecStartPre=/usr/bin/docker pull firehose/server
ExecStartPre=-/usr/bin/docker rm -f firehose-%i
ExecStart=/usr/bin/docker run --name firehose-%i -p 7474 --env-file /home/core/firehose.env firehose/server
ExecStop=/usr/bin/docker rm -f firehose-%i
User=core
TimeoutStartSec=5m
TimeoutStopSec=20s
RestartSec=30s
Restart=on-failure

[Install]
WantedBy=multi-user.target

[X-Fleet]
X-Conflicts=firehose@*.service

นี่เป็นการบอกว่าfirehose.serviceต้องการfirehose-announce.serviceเริ่มต้นเมื่อมันเกิดขึ้น (แต่อย่าล้มเหลวหากfirehose-announce.serviceไม่สามารถเริ่มได้) นอกจากนี้ยังทำให้แน่ใจว่าจะเริ่มต้นก่อนfirehose.servicefirehose-announce.service

ฉันทดสอบและตอนนี้หน่วยดูเหมือนจะหยุดและเริ่มร่วมกันตามที่ต้องการ


เยี่ยมมากฉันจะลองดู
nahime

1
เห็นได้ชัดว่าต้องการ = หมายถึงตัวเลือก ต้องการ = เป็นข้อกำหนด BindsTo หมายถึงถ้าการพึ่งพาเช่นบริการดับเพลิงบริการดับเพลิงประกาศให้บริการจะถือว่าหยุดเช่นกัน ฟังดูเหมือนเป็นเรื่องดีสำหรับฉัน
แมตต์

เป็นไปได้ไหมที่จะรับพฤติกรรมนี้โดยไม่ต้องสัมผัสกับเตาผิง
buddy123

ฉันลองวิธีนี้ แต่พบปัญหาเดียว ฉันมีบริการ A ที่ต้องการ = B.service และบริการ B พร้อม BindsTo = A.service เมื่อทางออกผิดปกติฉันเห็นทั้ง A และ B เริ่มต้นใหม่ แต่เมื่อ A ออกด้วยรหัส 0 / SUCESS ทั้งคู่ยังคงอยู่ในสถานะหยุดทำงาน
Bug Killer

ExecStartPre = {dash} -ไม่ได้ให้บริการกับจุดประสงค์สุดท้ายและใช้เพื่อจุดประสงค์ทั้งหมดยกเว้น ExecStartPre สุดท้าย
meffect
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.