Shell: é possível atrasar um comando sem usar 'sleep'?

19

Existem substitutos, alternativas ou truques bash para atrasar comandos sem usar sleep ? Por exemplo, executando o comando abaixo sem realmente usar sleep:

$ sleep 10 && echo "This is a test"
    
por user321697 19.11.2018 / 11:52

10 respostas

16

Você tem alternativas para sleep : elas são at e cron . Ao contrário de sleep , é necessário que você forneça o horário no qual você precisa que eles sejam executados.

  • Verifique se o serviço atd está em execução executando service atd status .
    Agora vamos dizer que a data é 11:17 da manhã UTC; se você precisar executar um comando às 11:25 UTC, a sintaxe será: echo "This is a test" | at 11:25 .
    Agora lembre-se de que atd por padrão não registrará a conclusão dos trabalhos. Para saber mais, consulte este link . É melhor que seu aplicativo tenha seu próprio log.

  • Você pode agendar trabalhos em cron , para mais referências: man cron para ver suas opções ou crontab -e para adicionar novos trabalhos. /var/log/cron pode ser verificado para obter informações sobre a execução de tarefas.

FYI sleep system call suspende a execução atual e agenda-a o argumento passou para ele.

EDITAR:

Como mencionado por @Gaius, você também pode adicionar minutos ao comando at . Mas vamos dizer que o tempo é 12:30:30 e agora você executou o agendador com now +1 minutes . Mesmo que 1 minuto, o que significa que 60 segundos foram especificados, o at realmente não espera até que 12:31:30 execute o trabalho, em vez disso, ele executa o trabalho em 12:31:00 . As unidades de tempo podem ser minutes, hours, days, or weeks . Para mais informações, consulte man at

por exemplo: echo "ls" | at now +1 minutes

    
por 19.11.2018 / 12:28
27

Com bash builtins, você pode fazer:

coproc read -t 10 && wait "$!" || true

Para dormir por 10 segundos sem usar sleep . O coproc é fazer com que o stdin de read seja um canal de onde nada sairá. || true é porque o status de saída de wait refletirá uma entrega SIGALRM que faria com que o shell fosse encerrado se a opção errexit estivesse configurada.

Em outros shells:

mksh e ksh93 têm sleep embutido, não adianta usar mais nada lá (embora ambos também suportem read -t ).

zsh também suporta read -t , mas também tem um wrapper incorporado em torno de select() , portanto você também pode usar:

zmodload zsh/zselect
zselect -t 1000 # centiseconds

Se o que você quer é programar coisas para serem executadas a partir de uma sessão de shell interativa, veja também zsh/sched module em zsh .

    
por 19.11.2018 / 12:27
6

Como existem respostas que estão sugerindo o uso da opção -t delay não-padrão de read , aqui está uma maneira de fazer uma leitura com tempo limite em um shell padrão:

{ ss='stty -g'; stty -icanon min 0 time 20; read foo; stty "$ss"; }

O argumento para stty time está em décimos de segundo.

    
por 19.11.2018 / 18:26
5

Usando a variável incorporada do bash $SECONDS e um loop ocupado:

for((target=$((SECONDS + 10)); SECONDS < target; true)); do :; done
    
por 19.11.2018 / 14:33
5

Algumas outras ideias.

top -d10 -n2 >/dev/null

vmstat 10 2 >/dev/null

sar 10 1 >/dev/null

timeout 10s tail -f /dev/null
    
por 19.11.2018 / 23:25
4

Voltando aos dias em que os microcomputadores rodavam o BASIC, os atrasos eram normalmente realizados com um loop vazio:

FOR I = 1 TO 10000:NEXT

O mesmo princípio pode ser usado para inserir um atraso em um script de shell:

COUNTER=0; while [ $COUNTER -lt 10000 ]; do :; let COUNTER=COUNTER+1; done

Naturalmente, o problema com essa abordagem é que a duração do atraso irá variar de máquina para máquina, de acordo com a velocidade do processador (ou mesmo na mesma máquina sob diferentes cargas). Ao contrário de sleep , ele provavelmente também irá maximizar sua CPU (ou um de seus núcleos).

    
por 19.11.2018 / 13:42
3

o truque mais antigo do livro:

read && echo "This is a test"

Basta pressionar Enter e ele continuará!

    
por 19.11.2018 / 12:21
3

Não há built-in, que faz o mesmo que sleep (a menos que sleep esteja embutido). No entanto, existem alguns outros comandos que aguardarão.

Alguns incluem.

  • at e cron : usado para agendar tarefas em um horário específico.

  • inotifywait : usado para aguardar um arquivo ou arquivos a serem modificados / removidos / adicionados / etc

por 19.11.2018 / 12:20
3

Um clássico da Terra das Janelas e dos Lotes:

ping -c 11 localhost >/dev/null && echo "This is a test"
    
por 20.11.2018 / 09:35
0

Se você quiser esperar interativamente por uma nova linha em um arquivo,

tail -f
.

Esperando por uma mudança em um sistema de arquivos? Em seguida, use, e.

inotify / inoticoming
.

E há outras opções, dependendo do que você quer dizer com "espera".

    
por 21.11.2018 / 16:35