comando “watch” para notificar arquivos recém-criados no linux

7

watch comando para notificar arquivos recém-criados no linux

Como modificar o comando abaixo para notificar a criação de um novo arquivo para / usr / local / mydir / pelo usuário do linux john?

watch -d 'ls -l /usr/local/mydir/ | fgrep john'

ie eu quero monitorar continuamente e chamar outro script se algum novo arquivo for criado para / usr / local / mydir /.

Como na produção, não posso usar nenhuma ferramenta em vez de shell script. Então, pode me ajudar com a solução de script shell?

    
por Aha 03.02.2012 / 11:21

3 respostas

8

Em vez de puxar constantemente um diretório dessa maneira, talvez tente usar o subsistema inotify , que é projetado para essa finalidade. Para ferramentas de espaço do usuário, dê uma olhada no inotify-tools .

    
por 03.02.2012 / 11:31
6

inotify sugerido por SvenW é uma excelente escolha para isso.

Apenas para ser diferente: Uma maneira alternativa e mais completa para esse tipo de coisa é usar o subsistema de auditoria do kernel e auditd . Basta instalar o auditd se ele ainda não estiver instalado e, em seguida, usar auditctl , no seu caso

auditctl -w /usr/local/mydir/ -p wa -F uid=john -k johnschangedfiles

faria.

Em seguida, você pode gerar um relatório e ver um registro detalhado do que aconteceu e quando:

ausearch -f /usr/local/mydir/

Isso produz resultados semelhantes a este:

time->Fri Feb  3 12:45:19 2012
type=PATH msg=audit(1328265919.961:11): item=0 name="/tmp/test/foo" inode=1839907 dev=fd:00 mode=0100664 ouid=500 ogid=500 rdev=00:00 obj=unconfined_u:object_r:user_tmp_t:s0
type=CWD msg=audit(1328265919.961:11):  cwd="/tmp"
type=SYSCALL msg=audit(1328265919.961:11): arch=c000003e syscall=2 success=yes exit=3 a0=7fffa6f4262e a1=941 a2=1b6 a3=3136fb0d0c items=1 ppid=12414 pid=23531 auid=500 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts1 ses=686 comm="touch" exe="/bin/touch" subj=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 key="jpikkschangedfiles"
    
por 03.02.2012 / 11:48
2

Se você insistir em usar apenas ferramentas padrão, um script como o seguinte pode ajudar:

#!/bin/bash
ls -l /usr/local/mydir | grep john > /tmp/watchfile

while true; do
   sleep 10
   ls -l /usr/local/mydir | grep john > /tmp/watchfile2
   diff -q /tmp/watchfile /tmp/watchfile2 > /dev/null
   if [ $? -ne 0 ] ; then
       echo "File list changed" 
       exit ;
   fi
   cp /tmp/watchfile2 /tmp/watchfile
done

Substitua a linha echo pela ação desejada e remova a linha exit se quiser executar esse script continuamente.

Observação: isso funcionará em qualquer modificação da listagem de diretórios, mesmo que os arquivos sejam atualizados, não adicionados.

    
por 03.02.2012 / 14:14