Antworten:
( 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 gemeinsame Fehler versucht , entweder zu geben sleep
oder echo
oder beide &
, das nicht wie vorgesehen. Wenn Sie eine Reihe von Befehlen ()
starten, werden diese in einem separaten Shell-Prozess erzeugt, mit dem Sie die gesamten Befehle in den Hintergrund verschieben können &
.
Insofern, als ich es als nützlich empfand. In einem eingebetteten Gerät, das ich entwickle, gibt es die Hauptanwendung, die mit einem Watchdog arbeitet. Wenn dies so fehlschlägt, dass der Watchdog-Reset kurz nach dem Start wiederholt ausgelöst wird, kann dies nur schwer aus der Ferne behoben werden, da die Zeitspanne zwischen dem Start des Betriebssystems und dem Zurücksetzen recht kurz ist und nicht ausreicht, um den App-Start zu blockieren. Ich brauche also eine Möglichkeit, um festzustellen, ob das System so schnell neu gestartet wurde, und gegebenenfalls eine Verzögerung einzuführen, damit ich Zeit habe, sie 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
die Haupt-App durchführe, wird sie nicht gestartet. Wenn der Watchdog startet, rm /tmp/startdelay
nicht ausgeführt wird und das nächste Mal das System startet, habe ich zusätzliche 30 Sekunden Zeit, um ihn zu stoppen. Andernfalls erfolgt der Neustart unverzüglich.
&
zu untermalen. "Sie müssen auch den Schlaf im Hintergrund" stand von Anfang an in der ersten Zeile. Wenn Sie mir nicht glauben, schauen Sie sich den Bearbeitungsverlauf an. Und meine Antwort ist 5 Minuten älter als deine: P
()
Gruppe nicht im Hintergrund haben , wird die ursprüngliche Shell angehalten, bis die erzeugte beendet ist.)
benutze den at
Befehl
echo "echo \"80\" > /sys/class/leds/blue/brightness" | at now + 5 min
das läuft im hintergrund
echo
ganz darauf verzichten, indem Sie einen Heredoc oder Herestring verwenden.
at
ist ein POSIX-Standardbefehl. Auf welchem Unix-ähnlichen System ist es standardmäßig nicht verfügbar?
Wenn Sie möchten, dass in 5 Minuten etwas ausgeführt wird, der Rest Ihres Programms jedoch fortgesetzt (oder beendet) wird, müssen Sie auch den Ruhezustand im Hintergrund anzeigen:
#!/bin/bash
runWithDelay () {
sleep $1;
shift;
"${@}";
}
runWithDelay 3 echo world &
echo hello
Dies wird gedruckt hello
und dann 3 Sekunden später (nachdem das Hauptprogramm beendet wurde) gedruckt world
.
Der wichtige Teil ist &
, die Funktionsausführung in den Hintergrund zu rücken.
runWithDelay () { sleep $1; "${@:2}"; }
stattdessen vorschlagen ?
doWhateverWithDelay 3 &
in Ihrem zweiten Beispiel gelesen werden .
$@
ist, dass Sie es zitieren können und als Liste der zitierten Wörter erweitert werden. Also mach es besser "$@"
(oder "${@}"
wenn du die Zahnspange magst). Siehe pastebin.com/MU7hbB2C
-n
) versucht, aber das war natürlich ein bisschen naiv.