AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 482725
Accepted
user321697
user321697
Asked: 2018-11-20 02:52:46 +0800 CST2018-11-20 02:52:46 +0800 CST 2018-11-20 02:52:46 +0800 CST

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

  • 772

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"
linux bash
  • 10 10 respostas
  • 24888 Views

10 respostas

  • Voted
  1. Stéphane Chazelas
    2018-11-20T03:27:03+08:002018-11-20T03:27:03+08:00

    Com bashbuiltins, você pode fazer:

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

    Para dormir por 10 segundos sem usar sleep. O coprocobjetivo é fazer com que reado stdin seja um tubo de onde nada saia. || trueé porque waito status de saída de 's refletirá uma entrega SIGALRM que faria com que o shell saísse se a errexitopção fosse definida.

    Em outras conchas:

    mkshe ksh93tem sleepbuilt-in, não faz sentido usar mais nada lá (embora ambos também suportem read -t).

    zshtambém suporta read -t, mas também possui um wrapper embutido em torno select()de , então você também pode usar:

    zmodload zsh/zselect
    zselect -t 1000 # centiseconds
    

    Se o que você deseja é agendar as coisas para serem executadas a partir de uma sessão de shell interativa, consulte também o zsh/schedmódulo emzsh .

    • 33
  2. Best Answer
    ss_iwe
    2018-11-20T03:28:17+08:002018-11-20T03:28:17+08:00

    Você tem alternativas para sleep: Eles são ate cron. Ao contrário sleepdisso, você precisa fornecer o horário em que precisa que eles sejam executados.

    • Verifique se o atdserviço está sendo executado executando service atd status.
      Agora, digamos que a data seja 11h17 UTC; se você precisar executar um comando às 11:25 UTC, a sintaxe é: echo "This is a test" | at 11:25.
      Agora tenha em mente que atdpor padrão não estará registrando a conclusão dos trabalhos. Para mais consulte este link . É melhor que seu aplicativo tenha seu próprio registro.

    • Você pode agendar trabalhos em cron, para mais consulte : man cronpara ver suas opções ou crontab -epara adicionar novos trabalhos. /var/log/cronpode ser verificado para obter as informações sobre a execução em trabalhos.

    FYI sleep system call suspende a execução atual e a agenda com o argumento passado para ela.

    EDITAR:

    Como o @Gaius mencionou, você também pode adicionar minutos ao comando. Mas atdigamos que o tempo é 12:30:30e agora você executou o agendador com now +1 minutes. Mesmo que 1 minuto, que se traduz em 60 segundos, tenha sido especificado , atele realmente não espera até 12:31:30executar o trabalho, mas executa o trabalho em 12:31:00. As unidades de tempo podem ser minutes, hours, days, or weeks. Para mais consulteman at

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

    • 19
  3. steve
    2018-11-20T14:25:35+08:002018-11-20T14:25:35+08:00

    Algumas outras ideias.

    top -d10 -n2 >/dev/null
    
    vmstat 10 2 >/dev/null
    
    sar 10 1 >/dev/null
    
    timeout 10s tail -f /dev/null
    
    • 9
  4. mosvy
    2018-11-20T09:26:04+08:002018-11-20T09:26:04+08:00

    Como há respostas sugerindo o uso da -t delayopção não padrão de read, aqui está uma maneira de fazer uma leitura expirada em um shell padrão:

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

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

    • 7
  5. Jeff Schaller
    2018-11-20T05:33:50+08:002018-11-20T05:33:50+08:00

    Usando a variável interna do bash $SECONDSe um loop ocupado:

    for((target=$((SECONDS + 10)); SECONDS < target; true)); do :; done
    
    • 6
  6. Psychonaut
    2018-11-20T04:42:49+08:002018-11-20T04:42:49+08:00

    Nos dias dos microcomputadores rodando BASIC, os atrasos eram geralmente 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

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

    • 5
  7. Fabby
    2018-11-20T03:21:36+08:002018-11-20T03:21:36+08:00

    o truque mais antigo do livro:

    read && echo "This is a test"
    

    Basta bater Entere ele vai continuar!

    • 4
  8. ctrl-alt-delor
    2018-11-20T03:20:29+08:002018-11-20T03:20:29+08:00

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

    Alguns incluem.

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

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

    • 3
  9. Joker_vD
    2018-11-21T00:35:20+08:002018-11-21T00:35:20+08:00

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

    ping -c 11 localhost >/dev/null && echo "This is a test"
    
    • 3
  10. Edheldil
    2018-11-22T07:35:37+08:002018-11-22T07:35:37+08:00

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

    tail -f
    .

    Esperando por uma mudança em um sistema de arquivos? Então use por exemplo

    inotify / inoticoming
    .

    E existem outras opções, dependendo do que você quer dizer com "esperar".

    • 0

relate perguntas

  • Problema estranho ao passar variáveis ​​do arquivo de texto

  • Enquanto a linha lê mantendo os espaços de escape?

  • ordem de substituição de processos `te` e `bash`

  • Passe o sistema de arquivos raiz por rótulo para o kernel do Linux

  • Execute um script muito lento até que seja bem-sucedido

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    ssh Não é possível negociar: "nenhuma cifra correspondente encontrada", está rejeitando o cbc

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    Como descarregar o módulo do kernel 'nvidia-drm'?

    • 13 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add retorna com: "Erro ao conectar ao agente: nenhum arquivo ou diretório" 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya Por que o Linux usa LF como caractere de nova linha? 2017-12-20 05:48:21 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve