如何使“inotifywait”仅在检测到的所有事件过去 5 秒后运行一次

问题描述 投票:0回答:1

请使用此脚本提供一点帮助:

#!/bin/bash

WATCH_DIR="/home/media/Movies"

# Comanda FileBot
FILEBOT_CMD="filebot -rename -r -non-strict \"$WATCH_DIR\" --db TheTVDB --format \"{n}/Season {s}/{n} - {s00e00} - {t}\" --action move --order Airdat"

# Monitorizeaza modificarile
inotifywait -m -r -e close_write "$WATCH_DIR" --format '%w%f' |
while read file; do
    echo "New Change: $file"
    eval $FILEBOT_CMD
done

此脚本检测文件是否打开以写入(修改)以及何时关闭文件写入(close_write),一切都很好,它正在工作,但我希望仅在所有文件完成后才加载脚本,之后5 秒内没有触发其他事件。有什么解决办法吗?

所以,如果我复制 5 个文件,我不希望脚本运行 5 次,相反,我希望脚本等到所有文件完成复制过程,然后只运行一次。检测是否在 5 秒内没有触发任何事件,然后仅运行一次 filebot 操作...无论文件大小如何,都应该发生这种情况。

提前谢谢您

linux bash ubuntu automation inotifywait
1个回答
0
投票

一种方法是不使用监视模式 (

-m
),而是让
inotifywait
在发生单个事件时退出,然后使用
inotifywait
选项以 5 秒超时重新调用
-t
并检查退出状态。如果发生事件,它将退出,并显示
0
;如果超时,则显示
2
(如果出现错误,则显示
1
)。然后,您的监控脚本可以循环重复该过程。

示例:

waitFor5SecondsSilence() {
    local ev=0
    while [[ $ev -eq 0 ]]; do
        inotifywait -t 5 -r -e close_write "$WATCH_DIR" --format '%w%f'
        ev=$?
    done
}

# Monitorizeaza modificarile
while true; do
    inotifywait -r -e close_write "$WATCH_DIR" --format '%w%f'
    waitFor5SecondsSilence
    eval "$FILEBOT_CMD"
done
© www.soinside.com 2019 - 2024. All rights reserved.