Executar comando após segundos (sem suspensão)

15

Como posso executar um comando após X segundos sem dormir. Ou com o sono, mas sem o shell, basta aguardar a resposta desse comando?

Eu usei isso, mas não funcionou

sleep 5 ; ls > a.txt

Eu preciso executá-lo em segundo plano. Eu tento não ter que executá-lo em um script, eu tento executar lsapós 5 segundos, e o shell não apenas espera pelo fim do sono

Martin
fonte
Por que não funciona sem o shell? Qual erro você recebe? Você está passando o caminho completo? Você sabe qual parte analisa o ;?
Hennes 04/04
dessa forma, o shell bloqueará 5 segundos e, em seguida, executará o comando., o shell ficará parado Eu não preciso disso.
Martin
Em seguida, você precisa iniciá-lo em um script em segundo plano ou em um sub-shell.
Hennes

Respostas:

33

Uma maneira mais concisa de escrever o que Hennes sugeriu é

(sleep 5; echo foo) & 

Como alternativa, se você precisar de mais de alguns segundos, poderá usar at. Existem três maneiras de dar um comando para at:

  1. Pipe it:

    $ echo "ls > a.txt" | at now + 1 min
    warning: commands will be executed using /bin/sh
    job 3 at Thu Apr  4 20:16:00 2013
    
  2. Salve o comando que você deseja executar em um arquivo de texto e passe esse arquivo para at:

    $ echo "ls > a.txt" > cmd.txt
    $ at now + 1 min < cmd.txt
    warning: commands will be executed using /bin/sh
    job 3 at Thu Apr  4 20:16:00 2013
    
  3. Você também pode passar atcomandos do STDIN:

    $ at now + 1 min
    warning: commands will be executed using /bin/sh
    at> ls
    

    Em seguida, pressione CtrlDpara sair do atshell. O lscomando será executado em um minuto.

Você pode dar tempos muito precisos no formato de [[CC]YY]MMDDhhmm[.ss], como em

$ at -t 201412182134.12 < script.sh

Isso executará o script script.shàs 21:34 e 12 segundos no dia 18 de dezembro de 2014. Portanto, em teoria, você pode usar atpara executar algo cinco segundos no futuro. No entanto, é como usar um tanque para golpear uma mosca, e a sugestão de Hennes é melhor.

Terdon
fonte
Continuei mexendo, $(sleep 5; echo foo) &não sei por que achava que precisava de um $ antes disso, mas com minha sintaxe errada, acabei de publicar a versão mais longa (e mais compreensível). (command_for_in_new_shell) é mais curto.
Hennes
@Hennes e eu descaradamente rasgamos sua muito boa idéia (que eu votei). Tudo o que fiz foi reformatá-lo para ser mais curto, todo o crédito pelos bits de pensamento reais é seu :).
Ter13
Existe alguma maneira de usar atcom um atraso em segundos?
Nic Hartley
@NicHartley no. Use um horário específico (por exemplo at 21:43), se é isso que você deseja, ou apenas faça algo simples como sleep 4 && commandexecutar commandapós 4 segundos.
terdon 18/03
4

Você pode contornar isso iniciando um shell ou um script em segundo plano.

Exemplo:

/ bin / sh -c "sono 5; eco foo" &
[1] 63791
> Prompt do shell ativo aqui

foo 5 segundos depois a saída aparece.
Hennes
fonte