รีสตาร์ทเซอร์วิส Systemd โดยอัตโนมัติทุกครั้งที่มีการเปลี่ยนแปลงไดเรกทอรี (ไฟล์ใด ๆ ที่อยู่ภายใน)


25

ฉันจะเริ่มบริการ Systemd ใหม่ได้อย่างไรเมื่อไฟล์มีการเปลี่ยนแปลง ฉันได้รับบริการ Java ที่ฉันต้องการโหลดใหม่เมื่อไฟล์ jar เปลี่ยนแปลง

นี่คือการตั้งค่าของฉัน:

srv.service

[Unit]
Description=srv 0.1: Service's description
After=network.target

[Service]
Type=simple
WorkingDirectory=/opt/srv
ExecStart=/opt/srv/bin/srv
User=root
Group=root

[Install]
WantedBy=multi-user.target

srv.path

[Path]
PathModified=/opt/srv/lib/

ฉันลองใช้PathChangedและใช้ไฟล์แทนไดเรกทอรี

เมื่อฉันติดตั้งบริการที่ฉันดำเนินการ: sudo systemctl daemon-reloadและ sudo systemctl enable srv

ขอบคุณ!


2
ไม่ได้ทดสอบดังนั้นจึงไม่ใช่คำตอบ แต่จากเอกสารดูเหมือนว่าpathหน่วยจะมีประโยชน์สำหรับการเปิดใช้งาน (เริ่มต้น) หน่วยอื่นเท่านั้น ที่นี่คุณอาจจะสร้างsrv-restart.pathด้วยPathChanged=/opt/srv/lib/และมีsrv-restart.service ExecStart=systemctl restart srv.service
Michał Politowski

ดูเหมือนว่าหากคุณตั้งชื่อมันเหมือนกับบริการ (ด้วย. path) ไฟล์พา ธ อ้างอิงถึงบริการเดียวกัน: freedesktop.org/software/systemd/man/systemd.path.htmlอย่างไรก็ตาม ... ฉันไม่รู้ ถ้ามันเริ่มให้บริการหรือรีสตาร์ทถ้ามันกำลังทำงานอยู่
ติดขัด

ตามที่ฉันเข้าใจจากเอกสารคุณsrv.pathสามารถทำสิ่งที่เทียบเท่าได้systemclt start srv.serviceดังนั้นสำหรับการรีสตาร์ทโดยอัตโนมัติคุณจะต้องใช้บริการอื่นซึ่งเมื่อเริ่มรีสตาร์ทบริการของคุณ
Michał Politowski

คุณต้องเริ่มต้นsystemctl start srv.path- และเพื่อเริ่มต้นการบูตsystemctl preset srv.path
Michael D.

1
ที่เกี่ยวข้อง: github.com/systemd/systemd/issues/4324
Michał Politowski

คำตอบ:


22

ความคิดเห็นของ Michal Politowski ถูกต้องแน่นอน ฉันใช้วิธีนี้เพื่อรีสตาร์ทบริการโดยอัตโนมัติเมื่อมีการปรับใช้สิ่งประดิษฐ์ใหม่ มันมีประโยชน์มาก

เพื่อความชัดเจนคุณต้อง:

srv.service

[Unit]
Description=srv 0.1: Service's description
After=network.target

[Service]
Type=simple
WorkingDirectory=/opt/srv
ExecStart=/opt/srv/bin/srv
User=root
Group=root

[Install]
WantedBy=multi-user.target

srv-watcher.service

[Unit]
Description=srv restarter
After=network.target

[Service]
Type=oneshot
ExecStart=/usr/bin/systemctl restart srv.service

[Install]
WantedBy=multi-user.target

srv-watcher.path

[Path]
PathModified=/opt/srv/lib

[Install]
WantedBy=multi-user.target

6
มีการรับประกันใด ๆ หรือไม่ว่าเมื่อใดที่เกิดข้อผิดพลาดนี้หากไฟล์จำนวนมากได้รับการเปลี่ยนแปลงอย่างรวดเร็ว
Rich Remer

3
เป็นสิ่งสำคัญที่ต้องจำไว้เช่นกันว่า«. path »ต้องเปิดใช้งานหน่วย ในกรณีนี้:systemctl enable srv-watcher.path && systemctl start srv-watcher.path
Pau Ruŀlan Ferragut

1
หากบริการการรีสตาร์ทของคุณไม่ใช่ชื่อเดียวกับ .path ไฟล์Unit=nameofmyrestart.serviceให้เพิ่มไปยัง[Path]ส่วนของ.pathไฟล์ ของคุณ freedesktop.org/software/systemd/man/systemd.path.html#Unit=
DKebler

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