Mulai ulang layanan Systemd secara otomatis setiap kali direktori berubah (file apa pun di dalamnya)

24

Bagaimana cara memulai kembali layanan Systemd ketika file berubah. Saya punya layanan Java yang ingin saya muat ulang ketika ada perubahan file jar.

Ini adalah pengaturan saya:

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/

Saya juga mencoba menggunakan PathChangeddan menggunakan file, bukan direktori.

Ketika saya menginstal layanan yang saya jalankan: sudo systemctl daemon-reloaddan sudo systemctl enable srv

Terima kasih!

kemacetan
sumber
2
Tidak diuji jadi bukan jawaban, tetapi dari dokumentasi tampaknya pathunit hanya berguna untuk mengaktifkan (memulai) unit lain. Di sini Anda mungkin dapat membuat srv-restart.pathdengan PathChanged=/opt/srv/lib/dan srv-restart.servicedengan ExecStart=systemctl restart srv.service.
Michał Politowski
Tampaknya jika Anda menamainya sama dengan layanan (dengan .path) file path merujuk ke layanan yang sama: freedesktop.org/software/systemd/man/systemd.path.html namun ... Saya tidak tahu jika hanya memulai layanan atau bahkan me-restart jika sudah berjalan
jamming
Seperti yang saya pahami dari dokumen, srv.pathhanya bisa melakukan yang setara systemclt start srv.service, jadi untuk mengotomatiskan restart Anda akan memerlukan layanan lain, yang ketika mulai me-restart layanan Anda.
Michał Politowski
Anda harus memulainya systemctl start srv.path- dan memulainya saat bootsystemctl preset srv.path
Michael D.
1
Relevan: github.com/systemd/systemd/issues/4324
Michał Politowski

Jawaban:

21

Komentar Michal Politowski benar. Saya menggunakan metode ini untuk memulai kembali layanan secara otomatis ketika artefak baru digunakan. Ini sangat membantu.

Agar jelas, Anda perlu:

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
John
sumber
6
Apakah ada jaminan kapan ini dipicu jika banyak file berubah secara berurutan?
Rich Remer
3
Penting untuk diingat bahwa unit «.path» juga perlu diaktifkan. Dalam hal ini:systemctl enable srv-watcher.path && systemctl start srv-watcher.path
Pau Ruŀlan Ferragut
1
Jika layanan restart Anda tidak dengan nama yang sama dengan .path file maka tambahkan saja Unit=nameofmyrestart.serviceke [Path]bagian .pathfile Anda . freedesktop.org/software/systemd/man/systemd.path.html#Unit=
DKebler
Berfungsi baik di CentOS untuk memulai kembali Kestrel (ASP.NET Core)
Suleman