เซอร์วิส Systemd Unit รีสตาร์ทหากเซอร์วิสอื่นเริ่มทำงานหรือโหลดซ้ำ


16

ฉันต้องการทราบว่ามีวิธีในSystemdการรีสตาร์ทA.service( After) เมื่อB.serviceเริ่มต้นหรือโหลดใหม่ (โหลดการกำหนดค่าใหม่เท่านั้น) หากเป็นไปได้โดยไม่ต้องแก้ไขB.serviceซึ่งติดตั้งและอัปเกรดโดยระบบ

A.serviceควรเริ่มต้นแม้ว่าB.serviceจะไม่ได้ติดตั้งปิดใช้งานหรือหยุด

A.service:

[Unit]
After = B.service network-online.target
Wants = B.service

[Service]
Type=oneshot
ExecStart = /script.sh start
ExecStop = /script.sh stop
RemainAfterExit=yes

[Install]
WantedBy = network-online.target

B.service:

[Unit]
After=syslog.target network.target

[Service]
Type=forking
ExecStart=/cmd start
ExecStop=/cmd stop
ExecReload=/cmd reload
PIDFile=/var/run/cmd.pid

[Install]
WantedBy=multi-user.target

คำตอบ:


12

คุณสามารถใช้PartOfใน[Unit]ส่วน

ตัวอย่าง: PartOf=B.service

จากหน้าคน

partof =

กำหนดค่าการพึ่งพาที่คล้ายกับต้อง = แต่ จำกัด เฉพาะการหยุดและรีสตาร์ทหน่วย เมื่อ systemd หยุดหรือรีสตาร์ทยูนิตที่แสดงที่นี่การดำเนินการจะถูกเผยแพร่ไปยังยูนิตนี้ โปรดทราบว่านี่เป็นการอ้างอิงแบบทางเดียว - การเปลี่ยนแปลงหน่วยนี้ไม่ส่งผลกระทบต่อหน่วยที่ระบุไว้


ขอบคุณฉันดูOverriding vendor settingsแต่สิ่งนี้ดูง่ายขึ้นและดีขึ้นสัญญาเท่านั้นที่ฉันไม่ต้องการAหยุดถ้าBหยุดA.restartถ้าB.startต่อไปฉันจะทำแบบทดสอบเร็ว ๆ นี้และดูว่ามีวิธีจัดการกับมันหรือไม่ จะแจ้งให้คุณทราบ
Alex

@ Alex: เกิดอะไรขึ้นถ้าคุณใช้PartOfและRestart=alwaysร่วมกัน?
Thushi

ฉันกำลังดูRestart=เอกสารฉันไม่แน่ใจว่าพฤติกรรมกับoneshotบริการคืออะไร แต่ไม่ว่า: When the death of the process is a result of systemd operation (e.g. service stop or restart), the service will not be restartedถ้าฉันเข้าใจถูกต้องด้วยตนเองการหยุด B จะหยุด A
Alex

ตอนนี้เงินรางวัลอัตโนมัติที่กำหนดเองสำหรับหมดอายุ @Thushi ฉันขอขอบคุณความพยายามและข้อเสนอแนะของคุณ แต่PartOfไม่ใช่วิธีแก้ปัญหาสำหรับคำถาม
อเล็กซ์

@Alex: เอาล่ะคะแนนไม่สำคัญสำหรับฉัน มีวิธีอื่น ๆ อีกมากมายที่ฉันจะได้รับคะแนน ฉันแค่อยากรู้ว่าโซลูชันที่ให้มาแก้ปัญหาของคุณได้หรือไม่ ถ้าไม่เราจะทำงานต่อไป วิธีใช้PartOfกับRestart=always? คุณลองแล้วหรือยัง
Thushi

3

ฉันมีการควบคุมมากกว่าไม่มีstopด้วยPartOf=และAจะต้องไม่หยุดกับBดังนั้นฉันสิ้นสุดที่ใช้แทนที่การตั้งค่าผู้ขายดูเหมือนว่าจะทำงาน

/etc/systemd/system/B.service.d/override.conf

[Service]
ExecStart=
ExecStart=/bin/sh -c '/cmd start || exit $?; sleep 5; [ -x /script.sh ] && /script.sh start; exit 0'
ExecReload=
ExecReload=/bin/sh -c '/cmd reload || exit $?; sleep 5; [ -x /script.sh ] && /script.sh start; exit 0'

/cmdการใช้งานแบบอะซิงโครนัสและเข้าถึงทรัพยากรที่/script.shจำเป็นต้องเข้าถึงด้วยฉันพบว่าไม่มีอะไรดีกว่า (ตอนนี้) ที่จะเข้าสู่โหมดสลีปไม่กี่วินาที

ฉันพยายามใช้systemctl [--no-block] try-restartก่อนใช้/script.shโดยตรง แต่ไม่ได้ผล


ฉันกำลังมองหาวิธีแก้ปัญหาสำหรับสถานการณ์นี้ คุณช่วยอธิบายวิธีแก้ปัญหานี้อีกสักหน่อยได้ไหม? หรือให้ลิงก์ไปยังเอกสารบางอย่างเพื่ออ่านและทำความเข้าใจกับสิ่งที่คุณทำ
zappy

สวัสดี @zappy ค้นหาคู่มือman systemd.unit(หรือค้นหาแบบออนไลน์หากไม่ได้ติดตั้งไว้) และค้นหาบท "การแทนที่การตั้งค่าผู้จัดจำหน่าย"
อเล็กซ์

ขอบคุณสำหรับข้อมูลของคุณ ฉันเข้าใจว่าคุณเลือกวิธีการด้านบนเพียงเพราะบริการ B เป็นผู้ขายเฉพาะและคุณไม่ต้องการแก้ไขไฟล์บริการนั้น แต่ในกรณีของฉันทั้งบริการ A และ B ไม่ใช่ผู้จัดส่ง ฉันรู้สึกว่าการเอาชนะมันอาจเพิ่มความซับซ้อนให้กับระบบ เรามีตัวเลือกอื่น ๆ บ้างไหม?
zappy

คำถามคือสองสามปีคุณตรวจสอบเอกสารหรือไม่ บางทีสถานการณ์นี้ได้รับการคุ้มครองตั้งแต่ ในเวลาที่ฉันกำลังรีบ แต่มีเวลาฉันจะมองหารายชื่อผู้รับจดหมาย systemd อย่างเป็นทางการและถามมีในที่สุดก็เปิดปัญหา
อเล็กซ์

1

ในขณะนี้ systemd ไม่ครอบคลุม senario นี้ คุณไม่สามารถใช้ฟังก์ชันนี้ผ่านไฟล์บริการเพียงอย่างเดียว ความเป็นไปได้อย่างหนึ่งคือการจี้ systemctl ผ่านเชลล์สคริปต์ที่มีชื่อเดียวกันและในการตรวจสอบนั้นเพื่อดูว่า B.service กำลังจะเริ่มใหม่หรือรีโหลดหรือโหลดใหม่ให้ดำเนินการที่เหมาะสมกับ A.service ด้วยและหากจำเป็นต้องอัพเดต rc.local เพื่อรับสถานะที่เหมาะสมเมื่อบู๊ตด้วย ฉันมีปัญหานี้กับ docker.service และ networking.service แต่ฉันเพิ่งรีสตาร์ทด้วยกันเสมอ:

systemctl รีสตาร์ท docker.service networking.service

เห็นได้ชัดว่าสิ่งนี้จะไม่มีผลหาก systemd จัดการกับ B.service ภายใน (เช่นผ่านไฟล์บริการอื่น ๆ )

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