O que eu gostaria de ter: Executar um comando y com o comando watch e fazer com que o comando watch seja atualizado apenas assim que a saída do comando y for alterada.
Imagine um script bash com 3 linhas de saída de eco
Hello world!
Hello universe!
Aloha multiverse!
Quero que o script bash seja monitorado, mas as atualizações só devem acontecer, se a saída tiver sido alterada devido à edição do script e salvamento posterior, portanto, data de modificação.
Temo que o comando watch, como de costume, atualizando a cada 2 segundos por padrão, ao ser executado várias horas diariamente, reduza a vida útil do disco de armazenamento muito rápido. Quero dizer, imagine quantas operações de leitura/gravação apenas esse comando produz. Eu sinto que isso é um desperdício. Seria muito melhor se o comando watch apenas dormisse, e o ato de salvar o comando assistido despertasse o watch, executando o script mais uma vez e depois dormisse novamente.
O que quero dizer é: O equivalente automático de fazer aquele trabalho manual que todos conhecemos: 1. Escrever em um script, 2. salvá-lo, 3. executá-lo novamente para ver se as alterações salvas funcionam conforme o esperado - repita. Quero dizer, para ver a mudança, não executamos o comando a cada 2 segundos, mas apenas uma vez, com base em eventos.
O preço de automatizar aquela tediosa alternância entre escrever um script e executá-lo é uma atualização de intervalo inevitável que desgasta a vida útil do disco de armazenamento devido ao crescimento excessivo dos processos de leitura e gravação?
Um compromisso poderia ser aumentar o tempo de intervalo pela opção -n, por exemplo, até a cada 30 segundos, mas não é possível assistir ao comando de alguma forma melhorar?
Quer dizer, eu já pensei em talvez deixar o watch sair pela opção -g assim que o arquivo fosse alterado, mas isso não muda nada no watch, causando operações de leitura a cada 2 segundos ou outro intervalo até que a mudança aconteça, mantendo o disco de armazenamento ocupado o tempo todo.
E embora os loops tenham o mesmo problema, não é? Ou essa poderia ser a solução: reconstruir o comando watch com um loop while, tornando-o verdadeiramente baseado em eventos de alguma forma (?) E minimizando a quantidade de operações de leitura e gravação durante o desenvolvimento de um script?
Trata-se de eficiência, minimalismo, economia de recursos tanto quanto possível.
Em vez de usar
watch
, useinotifywait
. Isso é construído no subsistema de notificação de inode do Linux , que fornece uma API baseada em eventos para observar alterações no sistema de arquivos.No Ubuntu, o
inotify-tools
pacote forneceinotifywait
, bem como várias outras pequenas ferramentas que operam em arquivos, diretórios ou sistemas de arquivos inteiros.Então, você poderia fazer (no bash):
Ou, usando
watch
(lembre-se do ponto e vírgula citado):E espero que o relógio não gere um monte de comandos para acompanhar os intervalos perdidos - como a
BUGS
seção em sua página de manual sugere que pode acontecer em determinadas circunstâncias.