Você pode fazer um loop que verifica a hora atual e ignora eventos idênticos (ou, em geral, semelhantes de uma forma que você pode definir) a um evento anterior. No bash, ksh ou zsh, o seguinte loop simples pula eventos repetidos em um período de 10 segundos:
inotifywait -m … | {
previous_SECONDS=0
previous_event=
while IFS= read -r event; do
if [[ "$event" = "$previous_event" && $SECONDS <= $previous_SECONDS + 10 ]]; then
continue
fi
previous_SECONDS=$SECONDS previous_event=$event
"$post_upload" "$event"
done
}
Os shells não são bons em processamento de texto de alto desempenho, então pode ser melhor usar uma ferramenta diferente. Você pode usar o awk, que por razões históricas tem uma maneira muito estranha de expor o tempo (como número de segundos desde a época): chamar srand()
retorna a hora da chamada anterior para srand()
.
inotifywait -m … | awk '
{srand(); current_time = srand()}
$0 == previous_event && current_time <= previous_time + 10 {
system(ENVIRON["post_upload"])
}
{previous_event = $0; previous_time = current_time}
'
A menos que você realmente precise de portabilidade, eu descartaria isso e usaria uma linguagem de script mais avançada, como Perl, Python ou Ruby. Esses idiomas têm uma interface para inotify, portanto, não é necessário chamar inotifywait
e fazer qualquer análise de texto.