inotifywait não está funcionando quando a pasta é excluída e recriada

2

Estou tentando usar o inotifywait para monitorar uma pasta:

inotifywait -m -r /home/oshiro/Desktop/work_folder

O comando funciona e, se eu criar arquivos nessa pasta, tudo parece funcionar corretamente.

Enquanto a pasta está sendo monitorada, se eu a excluir, recebo a seguinte saída:

/home/oshiro/Desktop/work_folder/ MOVE_SELF 
/home/oshiro/Desktop/work_folder/ OPEN,ISDIR 
/home/oshiro/Desktop/work_folder/ CLOSE_NOWRITE,CLOSE,ISDIR 
/home/oshiro/Desktop/work_folder/ MOVE_SELF 
/home/oshiro/Desktop/work_folder/ ATTRIB,ISDIR 
/home/oshiro/Desktop/work_folder/ OPEN,ISDIR 
/home/oshiro/Desktop/work_folder/ DELETE Untitled Document
/home/oshiro/Desktop/work_folder/ DELETE Untitled Document 2
/home/oshiro/Desktop/work_folder/ CLOSE_NOWRITE,CLOSE,ISDIR 
/home/oshiro/Desktop/work_folder/ DELETE_SELF 

Se eu recriar essa pasta novamente, enquanto o monitoramento ainda estiver ocorrendo, o inotifywait parece não continuar monitorando-a, a menos que eu execute inotifywait -m -r /home/oshiro/Desktop/work_folder novamente.

Como faço para contornar este problema? Eu basicamente quero monitorar um pendrive que será conectado e removido várias vezes durante o dia. Quando desconectado e plugado novamente, acho que o inotifywait irá parar de monitorá-lo, da mesma forma que a pasta acima foi excluída e recriada, onde inotifywait não pôde continuar monitorando, a menos que eu execute o comando acima novamente, ex: inotifywait -m -r /home/oshiro/Desktop/work_folder

Devo estar usando algo mais apropriado para essas tarefas e não usar o inotifywait? O cron não é adequado para minhas necessidades, pois não estou atrás de ações baseadas no tempo, estou atrás de ações baseadas em eventos.

    
por oshirowanen 04.04.2014 / 09:39

1 resposta

7

Primeiro, se você excluir uma pasta que inotifywait esteja assistindo, então, sim, ela não será mais assistida. A maneira mais óbvia é simplesmente monitorar o diretório um nível acima (você pode até mesmo criar um diretório para monitorar especialmente e colocar seu work_folder lá.

No entanto, isso não funcionará se você tiver uma pasta abaixo da qual é desmontada / remontada em vez de excluída / recriada, os dois são processos muito diferentes. Não tenho idéia se usar algo diferente de inotifywait é a melhor coisa, já que não tenho ideia do que você está tentando alcançar monitorando o diretório. No entanto, talvez a melhor coisa a fazer seja configurar uma regra udev para chamar como script que monta o pendrive e inicia o processo inotifywait quando ele está conectado e outro para interrompê-lo novamente quando estiver desconectado.

Você colocaria as regras udev em um arquivo .rules no diretório /etc/udev/rules.d '. As regras seriam parecidas com:

ENV{ID_SERIAL}=="dev_id_serial", ACTION=="add", \
  RUN+="/path/to/script add '%E{DEVNAME}'"
ENV{ID_SERIAL}=="dev_id_serial", ACTION=="remove", \
  RUN+="/path/to/script remove '%E{DEVNAME}'"

Em que ID_SERIAL do dispositivo pode ser determinado por:

udevadm info --name=/path/to/device --query=property

com o script algo como:

#!/bin/sh

pid_file=/var/run/script_name.pid
out_file=/var/log/script_name.log

# try to kill previous process even with add in case something
# went wrong with last remove
if [ "$1" = add ] || [ "$1" = remove ]; then
  pid=$(cat "$pid_file")
  [ "$(ps -p "$pid" -o comm=)" = inotifywait ] && kill "$pid"
fi

if [ "$1" = add ]; then
  /bin/mount "$2" /home/oshiro/Desktop/work_folder
  /usr/bin/inotifywait -m -r /home/oshiro/Desktop/work_folder \
    </dev/null >"$out_file" 2>&1 &
  echo $! >"$pid_file"
fi

Além disso, certifique-se de que a montagem por meio da regra udev não entre em conflito com outro processo que pode tentar montar automaticamente o disco quando ele estiver conectado.

    
por 04.04.2014 / 12:18