Se estou executando um processo longo, há alguma maneira de executar alguns comandos baseados em tempo?
Por exemplo, estou executando um processo muito longo, que dura aproximadamente 10 minutos.
Após 5 minutos, eu gostaria de executar um comando separado. Para ilustração, o comando separado pode ser:echo 5 minutes complete
(Nota: não quero avançar para a conclusão do comando, mas simplesmente comandos executados após intervalos especificados.)
É possível?
shell-script
shell
delay
Aniket Bhattacharyea
fonte
fonte
longcommand & sleep 300 && command-to-do-after-five-minutes
? (Na verdade, é provavelmente o que você está procurando.) Observe que seu esclarecimento não foi suficiente, pois você conseguiu duas implementações de barra de progresso do relógio logo de cara.Respostas:
Apenas corra:
A
do-this-after-five-minutes
corrida será executada após cinco minutos. Olong-command
será executado em segundo plano.fonte
sleep 5m && foobar
, então se eu mudar de idéia e ^ C osleep
, o próximo comando não será executado.sleep 3; ls
e^C
, o segundo comando não é executado de qualquer maneira. Não sabe ao certo por que e talvez funcione de maneira diferente em um shell não interativo?sleep 5m && echo
está em suspensão, quando você suspende, apenas osleep
comando está suspenso. O restante da linha de comando é executado, mas desde quesleep
foi suspenso, ele não foi encerrado com êxito e a parte após&&
foi ignorada. Tente suspendersleep 5 || echo hello
ehello
apareça diretamente após pressionar^Z
.at(1)
, para coisas comosleep 30m && mplayer something.mp3
lembrete de alarme ou parasleep 90m && fg
retomar um comando com uso intensivo de disco mais tarde. Então, na verdade,sleep 5m && echo hello
é bom porque^Z
suspendesleep
sem executar o seguinte comando. Se você deseja suspender / retomar todo o comando composto, mesmo antes de o sono terminar, use( sleep 2 && echo hello )
.&&
idioma permite que você tenha certeza absoluta de que não interrompe o processo logo após a suspensão (porque você pode^Z
não executar o comando, em vez de arriscar a^C
). Isso é útil no caso de usosleep && fg
ousleep && bg
, quando o comando que está sendo retomado é parcialmente lento.Você pode usar este script:
Ele executa o seu
longprocess
em umsub-shell
e monitora o arquivo 'lock' criado anteriormente para existência.fonte
man bash
háSECONDS
. Você pode definirSECONDS=0
no início roteiro e só verificar se há maior ou igual a 300 ou conjuntoSECONDS=$((date +%s))
e esquecer utilizandodate
novamente em seu script ...sleep 1s
sempre ter exatamente um segundo depois do que era antessleep 1s
... então você foi vítima das falsidades que os programadores acreditam sobre o tempo . (Embora neste caso, você pode também mostrar uma barra de progresso de marca de hash ou algo assim.) #sleep
nada!SECONDS
! :)Existe um liner para isso:
No seu caso, TIMEOUT = 5m e COMMAND é o comando longo.
Veja também minha resposta a este post Tempo limite com 'reinicialização da rede de serviço'
fonte
jobs %1
falha quando o trabalho% 1 é interrompido.Observe que, por períodos mais longos, $ segundos podem ficar fora de sincronia com o tempo real. É melhor armazenar a hora de início e calcular a diferença para a hora real.
fonte