GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie kann ich einen Befehl verzögert im Hintergrund ausführen?

( 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 eine neue Hintergrundaufgabe ausgeführt wird des Skripts beginnt mit zwei Befehlen:sleep und echo.

Der häufigste Fehler ist der Versuch, entweder sleep anzugeben oder echo oder beides & was nicht wie beabsichtigt funktioniert. Starten einer Reihe von Befehlen in () erzeugt sie jedoch in einem separaten Shell-Prozess, den Sie dann mit & vollständig in den Hintergrund schicken können .

Insofern, wo ich es aktiv nützlich fand. In einem eingebetteten Gerät, das ich entwickle, gibt es die Hauptanwendung, die mit einem Watchdog arbeitet. Wenn es auf eine Weise fehlschlägt, die den Watchdog-Reset kurz nach dem wiederholten Start auslöst, ist es schwierig, es aus der Ferne zu beheben, da der Zeitraum zwischen dem Start des Betriebssystems und dem Reset ziemlich kurz ist und nicht ausreicht, um sich per SSH einzuloggen und den App-Start zu blockieren. Also brauche ich einen Weg, um festzustellen, dass das System so schnell neu gestartet wurde, und eine Verzögerung einzuführen, falls dies der Fall ist, 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 mich anmelde und touch /tmp/noautostart ausführe Die Haupt-App startet nicht. Wenn der Watchdog eingreift, rm /tmp/startdelay wird nicht ausgeführt und beim nächsten Start des Systems habe ich zusätzliche 30 Sekunden Zeit, um es zu stoppen. Andernfalls erfolgt der Neustart schnell und ohne Verzögerung.


Verwenden Sie den at Befehl

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

das im Hintergrund läuft


Wenn Sie möchten, dass etwas in 5 Minuten ausgeführt wird, der Rest Ihres Programms jedoch fortgesetzt (oder beendet) wird, müssen Sie auch den Ruhezustand in den Hintergrund versetzen:

#!/bin/bash

runWithDelay () {
    sleep $1;
    shift;
    "${@}";
}

runWithDelay 3 echo world &
echo hello    

Dadurch wird hello ausgegeben und dann 3 Sekunden später (nachdem das Hauptprogramm beendet wurde), drucke world .

Der wichtige Teil ist der & um die Funktionsausführung in den Hintergrund zu verzweigen.


Linux
  1. So prüfen Sie Berechtigungen mit dem Befehl find

  2. Wie führe ich einen Befehl als Systemadministrator (root) aus?

  3. Wie sende ich Befehlszeilen-Apps direkt in den Hintergrund?

  4. Wie kann ich einen anderen Befehl ausführen, aber mit denselben Argumenten?

  5. So kombinieren Sie den Befehl „tar“ mit „find“

So führen Sie Linux-Befehle im Hintergrund aus

Verwendung des RPM-Befehls (mit Beispielen)

So ändern Sie die Ausgabefarbe von „Echo“ in Linux

So finden Sie Dateien mit dem fd-Befehl in Linux

Führen Sie Hintergrundprozesse in Linux mit dem Screen-Befehl aus

So verwenden Sie den Sleep-Befehl unter Linux:Erklärt mit Beispielen