inotifywait: vài lưu ý

Chạy inotifywait khi khởi động

5 cách để gọi chạy ứng dụng khi khởi động, trong đó rc.local được gọi muộn hơn trước khi xuất hiện màn hình đăng nhập.

Nếu cho inotifywait giám sát một symbolic link thì có thể gây lỗi “không tìm thấy” vì symlink chỉ được khởi tạo sau khi quá trình boot hoàn tất, khi đó phải chạy vòng lặp chờ symlink xuất hiện mới gọi chạy inotifywait.

Một cách khác là gọi chạy một systemd service. Có thể cài đặt để service tự gọi lại một vài lần cho đến khi thành công.

[Unit]
Description=Your Daemon Name

[Service]
ExecStart=/path/to/executable
Restart=on-failure
RestartSec=1s

[Install]
WantedBy=multi-user.target
  • Restart=on-failure sẽ khiến service tự khởi động lại nếu exit code khác 0
  • RestartSec chỉ định thời gian chờ trước khi khởi động lại

Để tránh việc khởi động lại service đi vào vòng lập vô tận, hai option hữu ích khác là StartLimitIntervalSec và StartLimitBurst

[Unit]
Description=Your Daemon Name
StartLimitIntervalSec=300
StartLimitBurst=5

[Service]
ExecStart=/path/to/executable
Restart=on-failure
RestartSec=1s

[Install]
WantedBy=multi-user.target

StartLimitIntervalSec xác định khung thời gian (giây) và StartLimitBurst xác định số lần tối đa service được phép khởi động lại trong khoảng thời gian đó trước khi thất bại.

Sau khi sửa file service, nhớ gọi lệnh

systemctl daemon-reload

Một cách khác là dùng timer

Tạo 2 file đơn giản

# nano /etc/systemd/system/cloudup.service

[Unit]
Description=Cloudup: autosync to remote

[Service]
Type=simple
ExecStart=/path/to/executable

[Install]
WantedBy=multi-user.target
# nano /etc/systemd/system/cloudup.timer

[Unit]
Description=Timer for the cloudup service

[Timer]
OnBootSec=15s
Unit=cloudup.service

[Install]
WantedBy=timers.target

Cập nhật systemd

systemctl daemon-reload

Kích hoạt timer

systemctl enable cloudup.timer

Tuy nhiên vì cloudup.service được gọi chạy từ timer nên nếu đã kích hoạt thì cần bỏ đi

systemctl disable cloudup.service

Monitor hay daemon?

Dùng tham số -d (daemon) thay vì -m (monitor) có thể khiến inotifywait không thể chạy khi khởi động, ngoài ra tham số -d phải dùng kèm với tham số -o (output). Thí dụ:

inotifywait -d -o /dev/null -e <event> --format <format> folder | while <code xử lý> done

Tên file có khoảng trắng

Việc code xử lý đọc event, watch_folder filename trong định dạng –format “%e %w %f” sẽ gặp lỗi vì không phân biệt được khoảng trắng phân cách trong định dạng trên và khoảng trắng trong tên file/thư mục.

Cách giải quyết là dùng định dạng –format “%e %w%f”, khi đó đọc eventfullname sau đó tự tách ra watch_folder filename nếu cần.

while read e p; do
  w=$(dirname "$p"); f=$(basename "$p")
  [ ! ${w: -1} = '/' ] && w=$w/
  ...
done

symbolic link

Nếu w symlink, inotifywait tự động đổi thành target tương tự như hàm readlink, tuy nhiên nếu f là symlink thì lại giữ nguyên không đổi.

Version

Mặc định khi cài đặt trên Bullseye, inotify-tools có phiên bản là 3.14

Phiên bản mới hơn sẽ giám sát luôn cả target của symlink. Để có phiên bản mới hơn chúng ta phải tải file nguồn về và tự biên dịch.

Comments Off on inotifywait: vài lưu ý

Filed under Software

Comments are closed.