วิธีการรับบริการ systemd ของฉันเริ่มต้นใหม่เมื่อมีการอัพเกรดการพึ่งพา


11

ฉันเขียนโปรแกรมที่ใช้ฐานข้อมูล Postgres และฉันเขียนไฟล์ serviced สำหรับบริการ ขณะนี้บริการของฉันเริ่มทำงานเมื่อบูตได้ดีและหยุดลงเมื่อ Postgres หยุดการอัปเกรด (โดยapt upgrade) อย่างไรก็ตามเมื่อการอัพเกรดเสร็จสมบูรณ์และ Postgres เริ่มต้นอีกครั้งบริการของฉันจะไม่เริ่มต้นโดยอัตโนมัติ

ฉันสามารถกำหนดการพึ่งพาบางส่วนเพื่อให้บริการของฉันเริ่มทำงานอีกครั้งโดยอัตโนมัติได้หรือไม่

นี่คือสถานะของการบริการของฉันหลังจากที่มันถูกหยุดโดยอัตโนมัติในระหว่างการอัพเกรด Postgres:

● tabill.service - My service
   Loaded: loaded (/srv/tabill/tabill.service; enabled; vendor preset: enabled)
   Active: inactive (dead) since Tue 2017-07-04 00:29:24 EEST; 44min ago
 Main PID: 1048 (code=killed, signal=TERM)

โปรดทราบว่าฉันสามารถเริ่มบริการด้วยตนเองอีกครั้งได้ดี

นี่คือไฟล์บริการของฉัน:

[Unit]
Description=My service
Wants=nginx.service
Requires=postgresql.service
After=postgresql.service

[Service]
Type=simple
ExecStart=/srv/tabill/app/serve
Restart=always
TimeoutSec=60

[Install]
WantedBy=multi-user.target

ฉันได้ลองเพิ่มPartOf=postgresql.serviceและBindsTo=postgresql.serviceจากนั้นหยุดและเริ่มต้น Postgres ด้วยตนเอง แต่ก็ไม่ได้ช่วยอะไร

แน่นอนฉันสามารถลบออกได้Requiresแต่การหยุดบริการทั้งสองเข้าด้วยกันเป็นสิ่งที่ดีกว่าถ้าเพียง แต่พวกเขาทั้งสองจะเริ่มสำรองข้อมูล


PartOf=ฟังดูเหมือนทางออกที่ถูกต้อง คุณลองRequires=ลบออกไหม
meuh

@ meuh ฉันลองตอนนี้ด้วยRequires=การนำออกที่ไม่ได้ช่วย ฉันคิดว่าปัญหาคือPartOf=ลิงก์ "หยุดและรีสตาร์ทหน่วย" แต่ Postgres ไม่รีสตาร์ทระหว่างการอัพเกรด มันหยุดอัพเกรดและเริ่ม
Rennex

เมื่อคุณทำเช่นsystemctl restart postgresqlนั้นแล้วระบบจะจดจำการเริ่มบริการที่ต้องพึ่งพาใหม่อีกครั้ง ดูเหมือนว่าฉลาดด้วยเหตุผลบางอย่างไม่รวมกันของstopและแทนstart restart
WGH

คำตอบ:


13

ฉันพบคำตอบ: ฉันต้องการเปลี่ยนบรรทัดสุดท้ายของไฟล์บริการเป็น:

WantedBy=postgresql.service

ด้วยวิธีนี้เมื่อใดก็ตามที่ Postgres เริ่มทำงานบริการของฉันก็เริ่มต้นเช่นกัน แต่ถ้าบริการของฉันล้มเหลวนั่นจะไม่หยุด Postgres

คำสั่งใน[Install]ส่วนจะมีผลกับการเปิดใช้งานและปิดการใช้งานหน่วย แต่นี่ไม่ใช่เรื่องง่ายเมื่อบริการของฉันเปิดใช้งานแล้ว:

# systemctl enable tabill.service
Failed to execute operation: Too many levels of symbolic links

ข้อความแสดงข้อผิดพลาดทำให้เข้าใจผิด แก้ไขมันง่าย:

# systemctl disable tabill.service
Removed symlink /etc/systemd/system/tabill.service.
Removed symlink /etc/systemd/system/multi-user.target.wants/tabill.service.

# systemctl enable tabill.service
Failed to execute operation: No such file or directory

# systemctl enable /srv/tabill/tabill.service
Created symlink from /etc/systemd/system/postgresql.service.wants/tabill.service to /srv/tabill/tabill.service.
Created symlink from /etc/systemd/system/tabill.service to /srv/tabill/tabill.service.

ตอนนี้บริการของฉันหยุดและเริ่มเมื่อใดก็ตามที่ Postgres ทำ และโดยปกติแล้ว Postgres จะเริ่มต้นเมื่อบูทระบบ

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