Respostas:
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
com o comando do tipo "history enabled"? Adoro usar watch
, 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 o watch
utilitário é muito mais limpo!
Você também pode usar este comando no terminal, além da resposta do nux:
while true; do <your_command>; sleep <interval_in_seconds>; done
Exemplo
while true; do ls; sleep 2; done
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 de pygmentize
funcionará, mas falhará ls --color=auto
.Nas circunstâncias acima, isso pode parecer uma opção melhor.
watch
existe para isso, este é um pouco inútil, eu diria
watch
é 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, o ll
que é alias, ls -laF
mas não pode ser usado com watch
. Além disso, se a saída de qualquer comando for bastante longa, você terá problemas ao rolar usando watch
. 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 preferir while 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 pouco SECONDS
para que a primeira ocorrência do comando aconteça.sleep
o while
loop? Não encontrei nenhuma diferença, Ctrl + C interrompeu o ciclo instantaneamente, não importa o quê.
command
e sleep
e só quebrar se você matar true
.
Parece a tarefa ideal para o cron
daemon, que permite executar comandos periódicos. Execute o crontab -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:
The time and date fields are:
field allowed values
----- --------------
minute 0-59
hour 0-23
day of month 1-31
month 1-12 (or names, see below)
day of week 0-7 (0 or 7 is Sunday, or use names)
Por exemplo, se você deseja executar um script Python toda terça-feira, às 11h:
0 11 * * 1 python ~/yourscript.py
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 com crontab -l
):
# Creates a temporary directory for ~/.distcc at boot
@reboot ln -sfn "$(mktemp -d "/tmp/distcc.XXXXXXXX")" "$HOME/.distcc"
cron
é executado nos bastidores em vez de no terminal
Se você está monitorando o sistema de arquivos, inotifywait
é brilhante e certamente adiciona menos carga ao seu sistema.
Exemplo:
No 1º terminal, digite este comando:
$ inotifywait .
Em seguida, no segundo terminal, qualquer comando que afete o diretório atual,
$ touch newfile
Em seguida, no terminal original, o inotifywait acordará e relatará o evento
./ CREATE newfile2
Ou em um loop
$ while true ; do inotifywait . ; done
Setting up watches.
Watches established.
./ OPEN newfile2
Setting up watches.
Watches established.
./ OPEN newfile2
Setting up watches.
Watches established.
./ DELETE newfile
Setting up watches.
Watches established.
./ CREATE,ISDIR newdir
Setting up watches.
Watches established.
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:
$ xdg-open ~/.bash-aliases
Segundo, cole estas linhas na parte inferior do arquivo e salve:
repeat() {
n=$1
shift
while [ $(( n -= 1 )) -ge 0 ]
do
"$@"
done
}
Terceiro, feche e abra novamente o seu terminal ou digite:
$ source ~/.bash_aliases
Et voilà! Agora você pode usá-lo assim:
$ repeat 5 echo Hello World !!!
ou
$ repeat 5 ./myscript.sh
você pode usar o crontab. execute o comando crontab -e
e abra-o com o seu editor de texto preferido e adicione esta linha
*/10 * * * * /path-to-your-command
Isso executará seu comando a cada 10 minutos
* */4 * * * /path-to-your-command
Isso executará seu comando a cada 4 horas
$ ..some command...; for i in $(seq X); do $cmd; sleep Y; done
X número de vezes para repetir.
Y tempo para esperar para repetir.
Exemplo:
$ echo; for i in $(seq 5); do $cmd "This is echo number: $i"; sleep 1;done
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.
while true; do script_that_take_between_10s_to_50s.sh; sleep 50; done
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:
while ( true ); do
echo Date starting `date`
before=`date +%s`
sleep `echo $(( ( RANDOM % 30 ) + 1 ))`
echo Before waiting `date`
after=`date +%s`
DELAY=`echo "60-($after-$before)" | bc`
sleep $DELAY
echo Done waiting `date`
done
Isso produzirá o seguinte:
Como você pode ver, o comando é executado a cada minuto:
Date starting Mon Dec 14 15:49:34 EST 2015
Before waiting Mon Dec 14 15:49:52 EST 2015
Done waiting Mon Dec 14 15:50:34 EST 2015
Date starting Mon Dec 14 15:50:34 EST 2015
Before waiting Mon Dec 14 15:50:39 EST 2015
Done waiting Mon Dec 14 15:51:34 EST 2015
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:
while ( true ); do
before=`date +%s`
sleep `echo $(( ( RANDOM % 30 ) + 1 ))` # Place you command here
after=`date +%s`
DELAY=`echo "60-($after-$before)" | bc`
sleep $DELAY
done
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.