Wie führe ich einen Befehl mit Verzögerung im Hintergrund aus?

Kann mir jemand zeigen, wie man ein Programm erstellt, um diese Aktion auszuführen: nach 5 Minuten

echo "80" > /sys/class/leds/blue/brightness 

Ich möchte, dass dieses Programm im Hintergrund ausgeführt wird (wie rngd -Dienst). Ich kann dies nicht tun, weil ich nicht so viel über Linux weiß.

Antwort

( sleep 300 ; echo "80" > /sys/class/leds/blue/brightness ) & 

Auf diese Weise wird Ihr Skript fortgesetzt oder Sie stellen die Kontrolle sofort wieder her, während ein neues Hintergrundaufgabe des Skripts wird mit zwei Befehlen gestartet: sleep und echo.

Der häufigste Fehler besteht darin, entweder sleep oder echo oder beide &, die nicht wie beabsichtigt funktionieren. Wenn Sie eine Reihe von Befehlen in () starten, werden diese in einem separaten Shell-Prozess erzeugt, den Sie dann mit & n den Hintergrund senden können.


Zu diesem Witz, wo ich es aktiv nützlich fand. In einem eingebetteten Gerät, das ich entwickle, gibt es die Hauptanwendung, die mit einem Watchdog funktioniert. Wenn sie so fehlschlägt, dass der Watchdog kurz nach dem Start wiederholt zurückgesetzt wird, ist es schwierig, sie in der Zeit zwischen dem Start des Betriebssystems und dem Start per Fernzugriff zu beheben Der Reset ist ziemlich kurz und reicht nicht aus, um den App-Start zu blockieren. Ich brauche also eine Möglichkeit, um festzustellen, ob das System so schnell neu gestartet wurde, und eine Verzögerung einzuführen, um mir Zeit zu geben, es manuell zu beheben.

 [ -f /tmp/startdelay ] && sleep 30 touch /tmp/startdelay ( sleep 30 ; rm /tmp/startdelay ) & [ -f /tmp/noautostart ] && exit 0 start_app 

Wenn ich Melden Sie sich an und führen Sie touch /tmp/noautostart aus. Die Haupt-App wird nicht gestartet. Wenn der Watchdog aktiviert wird, wird rm /tmp/startdelay nicht ausgeführt und die nächste Wenn das System startet, habe ich zusätzliche 30 Sekunden Zeit, um es zu stoppen. Andernfalls erfolgt der Neustart schnell und ohne Verzögerung.

Kommentare

  • Ja, ich stimme zu, aber das kann auch Teil der Benutzerreflexion sein; -)
  • Andere Antworten scheinen den " im Hintergrund " Teil zu verfehlen. Nein, ich war ziemlich explizit darüber: /
  • @goldilocks: Sie haben das Senden im Hintergrund erst hinzugefügt, nachdem ich meine Antwort gepostet habe.
  • Nein, meine ursprüngliche Antwort war, eine Funktion auszuführen, die Schlaf enthält mit & als Hintergrund für den Schlaf; " Sie müssen auch den Schlaf im Hintergrund anzeigen. " war von Anfang an in der ersten Zeile. Wenn Sie ' mir nicht glauben, sehen Sie sich den Bearbeitungsverlauf an. Und meine Antwort ist 5 Minuten älter als Ihre: P
  • @gekannt: … ähm, die Frage lautet " Wie man einen Befehl ausführt der Hintergrund mit einer Verzögerung? " – wie würden Sie es sonst erreichen? (und nein, wenn Sie die Gruppe () nicht ' hinterlegen

, wird die ursprüngliche Shell angehalten, bis die erzeugte beendet ist.)

Antwort

Verwenden Sie den Befehl at

echo "echo \"80\" > /sys/class/leds/blue/brightness" | at now + 5 min 

, das im Hintergrund ausgeführt wird

Kommentare

  • Dies ist der richtige Weg Der atd-Daemon muss jedoch ausgeführt werden, und auf den meisten Systemen muss ein Paket installiert sein.
  • Sie können einfache Anführungszeichen verwenden, um das Entkommen zu vermeiden, und auf echo insgesamt mit einem Heredoc oder Herestring.
  • @Julian, at ist ein Standard-POSIX-Befehl. Auf welchem Unix-ähnlichen System ' ist es standardmäßig nicht verfügbar?
  • @St é phaneChazelas – gute Frage . Ich weiß, dass ich ' dieses Problem hatte, aber es ist eine Weile her. Ich habe ein wenig nachgesehen und der Befehl at scheint ziemlich allgegenwärtig zu sein. Es scheint auch, dass atd Linux-spezifisch ist und sogar auf einigen Linux-Systemen durch einen Cron-Daemon im BSD-Stil ersetzt werden kann. Lassen Sie ' meinen Kommentar als veraltet betrachten.
  • Ich habe ' unter ' und unter Android 8 wurde kein Befehl gefunden.

Antwort

Wenn in 5 etwas ausgeführt werden soll Minuten, aber der Rest Ihres Programms, um fortzufahren (oder zu beenden), müssen Sie auch den Schlaf im Hintergrund anzeigen:

#!/bin/bash runWithDelay () { sleep $1; shift; "${@}"; } runWithDelay 3 echo world & echo hello 

Dies gibt hello und dann 3 Sekunden später (nachdem das Hauptprogramm beendet wurde) world.

Der wichtige Teil ist das &, um die Funktionsausführung in den Hintergrund zu rücken.

Kommentare

  • Darf ich stattdessen runWithDelay () { sleep $1; "${@:2}"; } vorschlagen?
  • Ich denke es sollte in Ihrem zweiten Beispiel doWhateverWithDelay 3 & lauten.
  • @manatwork: Cheers.
  • @goldilocks, das Wesentliche bei der Verwendung von $@ ist, dass Sie es zitieren können und als Liste der zitierten Wörter erweitert werden. Machen Sie es also besser "$@" (oder "${@}", wenn Sie die geschweiften Klammern mögen).Siehe pastebin.com/MU7hbB2C
  • @manatwork: Punkt genommen;) Ich habe versucht, Argumente mit Echo zu verwenden (-n), aber das war natürlich ein bisschen naiv.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.