Como posso usar 'stat' para detectar um novo arquivo e depois movê-lo para um diretório diferente?

1
Em última análise, quero detectar um novo arquivo de backup sendo descartado em um diretório e, em seguida, mover esse novo arquivo para outro local para outras operações.

Isso precisa funcionar quando não houver ninguém logado no servidor e o script que eu uso para iniciar a operação será acionado por uma entrada crontab.

Eu tentei usar o 'inotifywait' assim:

dir=/home/userid/drop/
target=/home/userid/current/

inotifywait -m "$dir" --format '%w%f' -e create |
    while read file; do
        mv "$file" "$target"
    done

Isso só funciona quando você tem uma sessão de janela de terminal aberta. Se você tentar iniciar este scipt autônomo usando uma entrada crontab, o comando inotifywait será ignorado.

Então eu tentei usar 'entr' e encontrei o mesmo problema. Só funciona se você tiver uma janela de terminal aberta. Quando eu criei um script usando entr e o desativei com uma entrada crontab, ele foi ignorado como o exemplo inotifywait.

Então eu sei que isso pode ser feito usando 'stat' e eu olhei muitos exemplos e tentei entendê-los para o meu propósito, mas eu não estou entendendo a sintaxe para isso.

Eu sei que o stat pode detectar a existência de um novo arquivo em um diretório, mas não sei como processar esse resultado para acionar a execução do comando mv (move) para mover o novo arquivo para um local diferente .

E assim que eu tiver uma sintaxe de estatísticas que possa fazer isso, precisarei que ela seja executada perpetuamente. Talvez ele só verifique a cada 15 segundos ou algo assim, mas eu precisarei estar sempre preparado para mover o arquivo.

Se alguém tiver experiência em fazer isso e puder gentilmente me ajudar com a sintaxe para vincular stat a executar outro comando, eu ficaria muito grato. Eu realmente acredito que os outros gostariam de saber como fazer isso também, porque eu não posso imaginar que todo mundo está bem em manter uma janela de ssh putty aberta 24/7 para as outras duas soluções.

Obrigado antecipadamente.

BKM

    
por BKM 18.08.2018 / 17:09

2 respostas

2

Tudo o que você precisa é de incron . Instale o pacote incron primeiro se você tiver o Ubuntu / Debian:

sudo apt install incron

ou use o comando para o Red Hat / Fedora:

sudo yum install incron

Abra o arquivo /etc/incron.allow no seu editor de texto favorito - seja vim :

vim /etc/incron.allow

e adicione uma nova linha com seu nome de usuário (assuma que é bob ) para permitir que ele use incron :

bob

Depois abra o editor de regras incron :

incrontab -e

e adicione a seguinte linha:

/home/userid/drop/ IN_CREATE mv /home/userid/drop/$# /home/userid/current/

em que $# é incron curinga incorporado, o que significa que o nome do arquivo de backup recém-descartado foi detectado por incron .

Para testar a regra criada, adicione um arquivo ao diretório /home/userid/drop/ e verifique se o arquivo removido foi movido para o diretório /home/userid/current/ . Além disso, verifique o syslog:

tail /var/log/syslog
    
por 18.08.2018 / 19:27
0

Um trabalho periódico de cron é inadequado, uma vez que esses são executados apenas ocasionalmente, enquanto um processo que reage a alterações de inode deve ser executado o tempo todo. Um trabalho @reboot que inicia um processo que (esperançosamente) é executado para sempre deve ser suficiente.

$ crontab -l
@reboot /home/jhqdoe/job
$ cat job
#!/bin/sh
dir=/home/jhqdoe/drop/
target=/home/jhqdoe/current/
inotifywait -m "$dir" --format '%w%f' -e create \
| while read file; do mv -- "$file" "$target"; done
$ sudo reboot

Um daemon de inicialização gerenciado pelo sistema init provavelmente seria uma opção melhor, se possível, já que eles são mais facilmente reiniciados se o trabalho falhar por vários motivos.

    
por 18.08.2018 / 18:36