Tự động khởi động lại dịch vụ Systemd bất cứ khi nào một thư mục thay đổi (bất kỳ tệp nào bên trong nó)


24

Làm cách nào để khởi động lại dịch vụ Systemd khi tệp thay đổi. Tôi đã có một dịch vụ Java mà tôi muốn tải lại khi có bất kỳ tệp jar nào thay đổi.

Đây là thiết lập của tôi:

dịch vụ

[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/

Tôi cũng đã thử sử dụng PathChangedvà sử dụng một tập tin thay vì một thư mục.

Khi tôi cài đặt dịch vụ, tôi đã thực thi: sudo systemctl daemon-reloadsudo systemctl enable srv

Cảm ơn!


2
Không được kiểm tra nên không phải là một câu trả lời, nhưng từ tài liệu có vẻ như pathcác đơn vị chỉ hữu ích cho việc kích hoạt (bắt đầu) các đơn vị khác. Ở đây bạn có thể có thể tạo srv-restart.pathvới PathChanged=/opt/srv/lib/srv-restart.servicevới ExecStart=systemctl restart srv.service.
Michał Politowski

Có vẻ như nếu bạn đặt tên giống như dịch vụ (với .path) thì tệp đường dẫn đề cập đến cùng một dịch vụ: freedesktop.org/software/systemd/man/systemd.path.html tuy nhiên ... Tôi không biết nếu nó chỉ bắt đầu một dịch vụ hoặc thậm chí khởi động lại nó nếu nó đang chạy
gây nhiễu

Theo tôi hiểu từ các tài liệu, srv.pathchỉ có thể thực hiện tương đương systemclt start srv.service, vì vậy để tự động khởi động lại, bạn sẽ cần một dịch vụ khác, khi bắt đầu khởi động lại dịch vụ của bạn.
Michał Politowski

Bạn cần khởi động nó systemctl start srv.path- và để nó khởi động khi khởi độngsystemctl preset srv.path
Michael D.

Câu trả lời:


21

Nhận xét của Michal Politowski là chính xác. Tôi sử dụng phương pháp này để tự động khởi động lại dịch vụ khi các tạo phẩm mới được triển khai. Nó rất hữu ích.

Để rõ ràng, bạn cần:

dịch vụ

[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
Có bất kỳ đảm bảo về thời điểm này được kích hoạt nếu nhiều tệp đang được thay đổi liên tiếp không?
Rich Remer

3
Điều quan trọng cần nhớ là đơn vị «.path» cũng cần được bật. Trong trường hợp này:systemctl enable srv-watcher.path && systemctl start srv-watcher.path
Pau Ruŀlan Ferragut

1
Nếu dịch vụ khởi động lại của bạn không cùng tên với .path tệp thì chỉ cần thêm Unit=nameofmyrestart.servicevào [Path]phần .pathtệp của bạn . freedesktop.org/software/systemd/man/systemd.path.html#Unit=
DKebler

Hoạt động tốt trong CentOS để khởi động lại Kestrel (ASP.NET Core)
Suleman
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.