Chạy inotifywait khi khởi động
Có 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 và 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 event và fullname sau đó tự tách ra watch_folder và 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 là 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.