Basta executar:
long-command & sleep 300; do-this-after-five-minutes
O do-this-after-five-minutes
será executado após cinco minutos. O long-command
será executado em segundo plano.
Se eu estiver executando um processo longo, existe alguma maneira de executar alguns comandos baseados em tempo?
Por exemplo, estou executando um processo muito longo que dura cerca de 10 minutos.
Após 5 minutos, gostaria de executar um comando separado. Por exemplo, o comando separado poderia ser: echo 5 minutes complete
(Nota: eu não quero progresso em direção à conclusão do comando, mas simplesmente comandos executados após intervalos especificados).
É possível?
Você pode usar este script:
#!/bin/bash
TEMPFILE="$(mktemp)"
STARTTIME="$(date +%s)"
(./longprocess; rm -f "$TEMPFILE") &
while [ -f "$TEMPFILE" ]; do
sleep 1s
NOW="$(date +%s)"
if (( (NOW-STARTTIME) % 300 == 0 )); then
echo "$(( (NOW-STARTTIME)/60 )) minute(s) elapsed"
fi
done
echo "Done!!!"
Ele executa seu longprocess
em um sub-shell
e monitora o arquivo 'lock' criado anteriormente para existir.
Existe um folheto para isso:
( ( sleep $TIMEOUT ; echo "5 minutes complete") & $COMMAND )
No seu caso TIMEOUT = 5m e COMMAND é o comando longo.
Veja também minha resposta para esta postagem Tempo limite com 'reinicialização da rede de serviço '
#! /bin/bash
( sleep 4 ) & # <-- The long running process.
seconds=1
while jobs %1 &>/dev/null ; do
echo $((seconds++)) seconds complete
sleep 1
done
echo Done.
jobs %1
falha quando o trabalho% 1 parou.
Observe que, por períodos mais longos, $ segundos podem ficar fora de sincronia com o tempo real. É melhor armazenar o horário de início e calcular a diferença para o tempo real.
Tags shell shell-script delay