Befehl nach Sekunden ausführen (ohne Sleep)

15

Wie kann ich einen Befehl nach X Sekunden ohne Ruhezustand ausführen? Oder mit Schlaf, aber ohne die Shell, warten Sie einfach auf die Antwort dieses Befehls?

Ich habe das benutzt, aber es hat nicht funktioniert

sleep 5 ; ls > a.txt

Ich muss es im Hintergrund ausführen. Ich versuche, es nicht in einem Skript ausführen zu müssen, das ich lsnach 5 Sekunden ausführen möchte, und die Shell wartet nicht nur auf das Ende des Ruhezustands

Martin
quelle
Warum funktioniert es nicht ohne die Shell? Welchen Fehler bekommst du? Passierst du es den ganzen Weg? Weißt du welcher Teil das parst ;?
Hennes
Auf diese Weise blockiert die Shell 5 Sekunden und führt dann den Befehl aus. Die Shell, die angehalten werden soll, brauche ich nicht.
Martin
Dann müssen Sie es entweder in einem Skript im Hintergrund oder in einer Sub-Shell starten.
Hennes

Antworten:

34

Eine prägnantere Schreibweise, die Hennes vorgeschlagen hat, ist

(sleep 5; echo foo) & 

Alternativ können Sie auch verwenden, wenn Sie mehr als einige Sekunden benötigen at. Es gibt drei Möglichkeiten, einen Befehl zu erteilen at:

  1. Pipe es:

    $ 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. Speichern Sie den Befehl, den Sie in einer Textdatei ausführen möchten, und übergeben Sie diese Datei an 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. Sie können auch atBefehle von STDIN übergeben:

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

    Drücken Sie dann, CtrlDum die atShell zu verlassen. Der lsBefehl wird in einer Minute ausgeführt.

Sie können sehr genaue Zeiten im Format angeben [[CC]YY]MMDDhhmm[.ss], wie in

$ at -t 201412182134.12 < script.sh

Dadurch wird das Skript script.sham 18. Dezember 2014 um 21:34 Uhr und 12 Sekunden ausgeführt. Theoretisch können Sie also atin Zukunft fünf Sekunden ausführen. Das ist jedoch so, als würde man eine Fliege mit einem Panzer schlagen, und Hennes 'Vorschlag ist besser.

terdon
quelle
Ich habe weiter rumgespielt und $(sleep 5; echo foo) &bin mir nicht sicher, warum ich dachte, ich brauche ein $ davor, aber mit falscher Syntax habe ich gerade die längere (und verständlichere) Version gepostet. (command_for_in_new_shell) ist allerdings kürzer.
Hennes
@Hennes und ich haben eklatant deine sehr gute Idee (die ich hochgestimmt habe) abgerissen. Alles, was ich getan habe, war es neu zu formatieren, um kürzer zu sein.
Terdon
Gibt es eine Möglichkeit, atmit einer Verzögerung in Sekunden zu verwenden?
Fund Monica's Lawsuit
@NicHartley nein. Verwenden Sie eine bestimmte Zeit (zB at 21:43) , wenn das ist , was Sie wollen, oder einfach nur etwas Einfaches tun wie sleep 4 && commandläuft commandnach 4 Sekunden.
Terdon
4

Sie können dies umgehen, indem Sie eine Shell oder ein Skript im Hintergrund starten.

Beispiel:

/ bin / sh -c "sleep 5; echo foo" &
[1] 63791
> Eingabeaufforderung für die aktive Shell hier

foo 5 Sekunden später erscheint die Ausgabe.
Hennes
quelle