Como posso repetir um comando a cada intervalo de tempo, para que eu possa executar comandos para verificar ou monitorar diretórios?
Não há necessidade de um script, preciso apenas de um comando simples para ser executado no terminal.
Como posso repetir um comando a cada intervalo de tempo, para que eu possa executar comandos para verificar ou monitorar diretórios?
Não há necessidade de um script, preciso apenas de um comando simples para ser executado no terminal.
Você pode usar o watch
comando, o watch é usado para executar qualquer comando designado em intervalos regulares.
Abra o Terminal e digite:
watch -n x <your command>
altere x para ser o tempo em segundos que você deseja.
Para obter mais ajuda sobre o watch
comando e suas opções, execute man watch
ou visite este link .
Por exemplo: a seguir, listamos, a cada 60s , no mesmo Terminal, o conteúdo do diretório Desktop, para que você possa saber se alguma alteração ocorreu:
watch -n 60 ls -l ~/Desktop
watch -n 1 'echo $COLUMNS'
ewatch -n 1 echo $COLUMNS
ao redimensionar seu terminal - o primeiro é expandido a cada segundo, mas o último é expandido apenas uma vez antes dowatch
início.watch
com o comando do tipo "history enabled"? Adoro usarwatch
, mas às vezes prefiro ver um log de execuções anteriores, em vez de apenas a última. E sim, eu sei que posso usar scripting (while true
) para fazer isso, mas usar owatch
utilitário é muito mais limpo!Você também pode usar este comando no terminal, além da resposta do nux:
Exemplo
Este comando imprimirá a saída
ls
em um intervalo de 2 segundos.Use Ctrl+ Cpara parar o processo.
Existem algumas desvantagens de
watch
watch
interpretará seqüências de cores ANSI que passam caracteres de escape usando a opção-c
ou--color
. Por exemplo, a saída depygmentize
funcionará, mas falharáls --color=auto
.Nas circunstâncias acima, isso pode parecer uma opção melhor.
fonte
watch
existe para isso, este é um pouco inútil, eu diriawatch
é bom na maioria dos casos. É por isso que mencionei "além da resposta do nux" no começo. Mas existem alguns problemas com,watch
por exemplo, um não pode usar nenhum comando com aliaswatch
. Tomemos, por exemplo, oll
que é alias,ls -laF
mas não pode ser usado comwatch
. Além disso, se a saída de qualquer comando for bastante longa, você terá problemas ao rolar usandowatch
. Nestes poucos casos especiais, esta resposta pode parecer uma opção melhor.watch
pelo menos permite as opções-c
ou--color
para saída colorida.while sleep x
é melhor - é mais fácil matar.watch
, mantém o histórico de comandos.Só queria entrar nas respostas de souravc e nux :
watch
funcione perfeitamente no Ubuntu, você pode evitar que, se quiser que seu "Unix-fu" seja puro - no FreeBSD, por exemplo, watch é um comando para "bisbilhotar em outra linha tty".while true; do command; sleep SECONDS; done
também tem uma ressalva - o seu comando pode ser mais difícil de matar usando CTR + C . Você pode preferirwhile sleep SECONDS; do command; done
- não é apenas mais curto, mas também mais fácil de interromper. A ressalva é que ele dormirá primeiro e, em seguida, execute seu comando, portanto, será necessário aguardar um poucoSECONDS
para que a primeira ocorrência do comando aconteça.fonte
sleep
owhile
loop? Não encontrei nenhuma diferença, Ctrl + C interrompeu o ciclo instantaneamente, não importa o quê.command
esleep
e só quebrar se você matartrue
.Parece a tarefa ideal para o
cron
daemon, que permite executar comandos periódicos. Execute ocrontab -e
comando para começar a editar a configuração do cron do usuário. Seu formato está documentado no crontab (5) . Basicamente, você tem cinco campos separados por espaço e relacionados ao tempo, seguidos por um comando:Por exemplo, se você deseja executar um script Python toda terça-feira, às 11h:
Existem também alguns nomes especiais que substituem a hora, como
@reboot
. Muito útil se você precisar criar um diretório temporário. No meu crontab (listado comcrontab -l
):fonte
cron
é executado nos bastidores em vez de no terminalSe você está monitorando o sistema de arquivos,
inotifywait
é brilhante e certamente adiciona menos carga ao seu sistema.Exemplo:
No 1º terminal, digite este comando:
Em seguida, no segundo terminal, qualquer comando que afete o diretório atual,
Em seguida, no terminal original, o inotifywait acordará e relatará o evento
Ou em um loop
fonte
grep something InALogFile|less
é um script?.
eu não posso deixar de fora o comando.-m
para monitorar continuamente sem um loop.Você pode criar seu próprio
repeat
comando, executando as seguintes etapas; créditos aqui :Primeiro, abra seu
.bash_aliases
arquivo:Segundo, cole estas linhas na parte inferior do arquivo e salve:
Terceiro, feche e abra novamente o seu terminal ou digite:
Et voilà! Agora você pode usá-lo assim:
ou
fonte
você pode usar o crontab. execute o comando
crontab -e
e abra-o com o seu editor de texto preferido e adicione esta linhaIsso executará seu comando a cada 10 minutos
Isso executará seu comando a cada 4 horas
Outra solução possível
X número de vezes para repetir.
Y tempo para esperar para repetir.
Exemplo:
fonte
Outra preocupação com a abordagem de "observação" proposta acima é que ela exibe o resultado somente quando o processo é concluído. "date; sleep 58; date" exibirá as 2 datas somente após 59 segundos ... Se você iniciar algo em execução por 4 minutos, que exibe lentamente várias páginas de conteúdo, você realmente não o verá.
Por outro lado, a preocupação com a abordagem "enquanto" é que ela não leva em consideração a duração da tarefa.
Com isso, o script será executado em algum momento a cada minuto, em algum momento poderá demorar 1m40. Portanto, mesmo que um cron possa executá-lo a cada minuto, aqui não será.
Portanto, para ver a saída no shell conforme ela é gerada e aguardar o tempo exato da solicitação, você precisa observar o tempo antes e depois e fazer um loop com o tempo.
Algo como:
Isso produzirá o seguinte:
Como você pode ver, o comando é executado a cada minuto:
Portanto, basta substituir o
echo $(( ( RANDOM % 30 ) + 1 ))
comando " sleep " pelo que você quiser e ele será executado, no terminal / shell, exatamente a cada minuto. Se você quiser outra programação, basta alterar os segundos "60" com o que você precisar.Versão mais curta sem as linhas de depuração:
fonte