Quero que um script durma, a menos que um determinado arquivo seja modificado/excluído (ou um arquivo criado em um determinado diretório, ou ...). Isso pode ser alcançado de uma forma elegante? A coisa mais simples que me vem à mente é um loop que dorme por algum tempo antes de verificar o status novamente, mas talvez haja uma maneira mais elegante?
No linux, você pode usar o recurso inotify
do kernel. As ferramentas de script podem ser encontradas lá: inotify-tools .
Exemplo de uso do wiki:
#!/bin/sh
EVENT=$(inotifywait --format '%e' ~/file1) # blocking without looping
[ $? != 0 ] && exit
[ "$EVENT" = "MODIFY" ] && echo 'file modified!'
[ "$EVENT" = "DELETE_SELF" ] && echo 'file deleted!'
# etc...
Existe uma API chamada inotify para programadores C.
Existem algumas ferramentas que o utilizam, por ex. incron e ferramentas do inotify .
De fato, há: entr (1) executará comandos arbitrários quando os arquivos forem alterados e também fornece uma opção de recarregamento automático para reiniciar servidores de aplicativos.
editar: alguns exemplos
Reconstruir se os arquivos de origem mudarem
$ find *.c | entr make
Inicie e recarregue automaticamente o servidor de teste se os arquivos mudarem
$ ls *.py | entr -r python main.py
Fornecendo um documento +/path/to/fifo
permite um script mais complexo instruindo entr
a escrever o nome de cada arquivo que muda para um canal nomeado. O seguinte irá converter arquivos Markdown no diretório atual para HTML à medida que são editados
$ ls *.md | entr +/tmp/notify &
$ while read F
> do
> markdown2html $F
> done < /tmp/notify