É possível na linha de comando do Linux repetir um comando a cada n segundos?
Digamos, eu tenho uma importação em execução e estou fazendo
ls -l
para verificar se o tamanho do arquivo está aumentando. Eu gostaria de ter um comando para repetir isso automaticamente.
watch mysql dbname -e \"show processlist\;\"
brew install watch
fonte
watch
também tem o efeito colateral infeliz de limpar a tela; portanto, às vezes o loop é útil. Qual usar depende do formato desejado da saída.--differences
para tê-los realçado (Se você está preocupado com o redesenho do terminal)watch
. O Watch não funciona, por exemplo, quando você deseja gerar um número aleatório em cada chamada, por exemplowatch -n 1 echo ${RANDOM}
. O aleatório será chamado apenas uma vez."watch" não permite frações de segundo no Busybox, enquanto "sleep" permite. Se isso lhe interessa, tente o seguinte:
fonte
sleep
já retorna0
. Como tal, estou usando:Isso é um pouco menor que a solução de mikhail. Uma desvantagem menor é que ele dorme antes de executar o comando target pela primeira vez.
fonte
Se o comando contiver alguns caracteres especiais, como pipes e aspas, o comando precisará ser preenchido com aspas. Por exemplo, para repetir
ls -l | grep "txt"
, o comando watch deve ser:watch -n 5 'ls -l | grep "txt"'
fonte
Executar comandos periodicamente sem cron é possível quando seguimos
while
.Como um comando:
Exemplo:
Não esqueça o último,
&
pois ele colocará seu loop em segundo plano. Mas você precisa encontrar o ID do processo com o comando "ps -ef | grep your_script" e depois matá-lo. Portanto, adicione o '&' ao executar o script.Aqui está o mesmo loop de um script. Crie o arquivo "while_check.sh" e coloque-o:
Em seguida, execute-o digitando
bash ./while_check.sh &
fonte
echo $!
depois que cada processo em segundo plano for iniciado - esse é o PID do último processo filho iniciado em segundo plano.echo `date`
é apenas uma maneira pobre e ligeiramente incorreta de escrever apenasdate
. (O bug tem a ver com a falta de citação do argumento paraecho
.) Veja também o uso inútil deecho
.o relógio é bom, mas limpa a tela.
fonte
Se você quiser evitar "desviar", o que significa que você deseja que o comando execute a cada N segundos, independentemente do tempo que leva (supondo que leve menos de N segundos), aqui está uma lista que repetirá um comando a cada 5 segundos com um segunda precisão (e imprimirá um aviso se não conseguir acompanhar):
Ainda pode demorar um pouco, pois o sono é preciso apenas por um segundo. Você pode melhorar essa precisão usando o comando date com criatividade.
fonte
Se você quiser fazer algo um número específico de vezes, sempre poderá fazer isso:
fonte
for x in {1..300} ; do
comandos bash do||break;sleep 1.5; done
Você pode executar o seguinte e filtrar apenas o tamanho. Se seu arquivo foi chamado,
somefilename
você pode fazer o seguintewhile :; do ls -lh | awk '/some*/{print $5}'; sleep 5; done
Uma das muitas idéias.
fonte
Para minimizar a deriva mais facilmente, use:
ainda haverá uma pequena quantidade de desvio devido ao tempo do bash para executar a estrutura do loop e ao comando sleep para realmente ser executado.
dica: ':' evals para 0 ou seja, verdadeiro.
fonte
Executar
ls -l
comando após cada 5sResultado :-
fonte
Uma solução concisa, que é particularmente útil se você deseja executar o comando repetidamente até que ele falhe e permite ver toda a saída.
fonte