Eu acho que sua abordagem está correta, e rastrear o cookie é uma maneira robusta de fazer isso.
No entanto, o único local na origem de inotify-tools (3.14) que cookie
é referenciado está no cabeçalho que define o struct
para corresponder à API do kernel.
Se você gosta de viver no limite, este patch ( issue # 72 ) se aplica de forma limpa a < href="https://github.com/rvoicilas/inotify-tools/tree/v3.14"> 3.14 e adiciona um especificador de formato %c
para o cookie do evento em hex:
--- libinotifytools/src/inotifytools.c.orig 2014-10-23 18:05:24.000000000 +0100
+++ libinotifytools/src/inotifytools.c 2014-10-23 18:15:47.000000000 +0100
@@ -1881,6 +1881,12 @@
continue;
}
+ if ( ch1 == 'c' ) {
+ ind += snprintf( &out[ind], size-ind, "%x", event->cookie);
+ ++i;
+ continue;
+ }
+
if ( ch1 == 'e' ) {
eventstr = inotifytools_event_to_str( event->mask );
strncpy( &out[ind], eventstr, size - ind );
Essa alteração modifica libinotifytools.so
, não o inotifywait
binário. Para testar antes da instalação:
LD_PRELOAD=./libinotifytools/src/.libs/libinotifytools.so.0.4.1 \
inotifywait --format="%c %e %f" -m -e move /tmp/test
Setting up watches.
Watches established.
40ff8 MOVED_FROM b
40ff8 MOVED_TO a
Supondo que MOVED_FROM sempre ocorra antes de MOVED_TO (veja, fsnotify_move()
, e é uma fila ordenada , embora movimentos independentes pode ficar intercalado) no seu script você armazena em cache os detalhes quando vê uma linha MOVED_FROM (talvez em um array associativo indexado por ID), e executa seu processamento quando vê um MOVED_TO com a metade correspondente do informação.
declare -A cache
inotifywait --format="%c %e %f" -m -e move /tmp/test |
while read id event file; do
if [ "$event" = "MOVED_FROM" ]; then
cache[$id]=$file
fi
if [ "$event" = "MOVED_TO" ]; then
if [ "${cache[$id]}" ]; then
echo "processing ..."
unset cache[$id]
else
echo "mismatch for $id"
fi
fi
done
(Com três threads em execução para embaralhar um par de arquivos a cada 10.000 vezes, nunca vi um único evento fora de ordem ou intercalação de eventos. Pode depender do sistema de arquivos e de outras condições, é claro.)