Esegui comando dopo secondi (senza sospensione)


15

Come posso eseguire un comando dopo X secondi senza dormire. O con il sonno ma senza la shell aspettate solo la risposta di quel comando?

L'ho usato ma non ha funzionato

sleep 5 ; ls > a.txt

Devo eseguirlo in background. Provo a non doverlo eseguire in uno script che provo a eseguire lsdopo 5 secondi e la shell non aspetta solo la fine del sonno


Perché non funziona senza la shell? Quale errore ricevi? Lo stai superando per intero? Sai quale parte analizza il ;?
Hennes,

in questo modo la shell si bloccherà 5 secondi e quindi eseguirà il comando., la shell da bloccare non mi serve.
Martin

Quindi è necessario avviarlo in uno script in background o in una shell secondaria.
Hennes,

Risposte:


34

Un modo più conciso di scrivere ciò che Hennes ha suggerito è

(sleep 5; echo foo) & 

In alternativa, se hai bisogno di più di qualche secondo, puoi usarlo at. Esistono tre modi per dare un comando a 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. Salvare il comando che si desidera eseguire in un file di testo, quindi passare quel file a 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. Puoi anche passare i atcomandi da STDIN:

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

    Quindi, premere CtrlDper uscire dalla atshell. Il lscomando verrà eseguito tra un minuto.

Puoi dare tempi molto precisi nel formato di [[CC]YY]MMDDhhmm[.ss], come in

$ at -t 201412182134.12 < script.sh

Questo eseguirà la sceneggiatura script.shalle 21:34 e 12 secondi il 18 dicembre 2014. Quindi, in teoria, potresti usare atqualcosa per cinque secondi in futuro. Tuttavia, è un po 'come usare un carro armato per schiacciare una mosca, e il suggerimento di Hennes è migliore.


Ho continuato a scherzare $(sleep 5; echo foo) &non sono sicuro del perché pensassi di aver bisogno di un $ davanti a quello, ma con la mia sintassi sbagliata ho appena pubblicato la versione più lunga (e più comprensibile). (command_for_in_new_shell) è però più breve.
Hennes,

@Hennes e io abbiamo palesemente strappato via la tua ottima idea (che ho votato). Tutto quello che ho fatto è stato riformattarlo per essere più breve, tutto il merito per i pezzi del pensiero reale è tuo :).
terdon,

Esiste un modo per utilizzare atcon un ritardo in secondi?
Finanzia la causa di Monica il

@NicHartley no. Usa un tempo specifico (ad es. at 21:43) Se è quello che vuoi, o fai semplicemente qualcosa di semplice come sleep 4 && commandcorrere commanddopo 4 secondi.
terdon,

4

Puoi aggirare il problema avviando una shell o uno script in background.

Esempio:

/ bin / sh -c "sleep 5; echo foo" &
[1] 63791
> Richiesta di shell attiva qui

appare dopo 5 secondi.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.