it-swarm.com.de

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 der Dienst rngd). Ich kann dies nicht tun, weil ich nicht so viel über Linux weiß.

34
user53337
( 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 des Skripts mit zwei Befehlen gestartet wird: sleep und echo.

Der häufigste Fehler besteht darin, entweder sleep oder echo oder beide & Zu geben, was nicht wie beabsichtigt funktioniert. Wenn Sie eine Reihe von Befehlen in () Starten, werden diese in einem separaten Shell-Prozess erzeugt, den Sie dann mit & Als Ganzes in 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 dies auf eine Weise fehlschlägt, die das wiederholte Zurücksetzen des Watchdogs kurz nach dem Start auslöst, ist es schwierig, es aus der Ferne zu beheben, da der Zeitraum zwischen dem Start des Betriebssystems und dem Zurücksetzen recht kurz ist und nicht ausreicht, um den Start der App einzuschalten und 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 reparieren.

 [ -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, wird die Haupt-App nicht gestartet. Wenn der Watchdog startet, wird rm /tmp/startdelay Nicht ausgeführt und beim nächsten Systemstart habe ich zusätzliche 30 Sekunden Zeit, um ihn zu stoppen. Andernfalls erfolgt der Neustart schnell und ohne Verzögerung.

56
SF.

verwenden Sie den Befehl at

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

das läuft im Hintergrund

11
exussum

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 im Hintergrund festlegen:

#!/bin/bash

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

runWithDelay 3 echo world &
echo hello    

Dies druckt hello und 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.

6
goldilocks