Risposte:
( sleep 300 ; echo "80" > /sys/class/leds/blue/brightness ) &
In questo modo il tuo script continua o ripristini immediatamente il controllo, mentre inizia una nuova attività in background dello script, con due comandi: sleep ed echo.
L'errore comune sta cercando di dare uno sleep
o echo
o entrambi il &
che non funziona come previsto. L'avvio di una serie di comandi ()
li genera in un processo di shell separato, che è quindi possibile inviare in background intero &
.
A tal proposito, dove l'ho trovato attivamente utile. In un dispositivo incorporato che sviluppo c'è l'applicazione principale che funziona con un cane da guardia. Se fallisce in un modo che innesca il reset del watchdog subito dopo l'avvio, ripetutamente, è difficile risolvere il problema in remoto poiché il periodo tra l'avvio del sistema operativo e il ripristino è piuttosto breve, non abbastanza per entrare e bloccare l'avvio dell'app. Quindi ho bisogno di un modo per determinare il riavvio del sistema così velocemente e introdurre un ritardo, se così fosse, per darmi il tempo di ripararlo manualmente.
[ -f /tmp/startdelay ] && sleep 30
touch /tmp/startdelay
( sleep 30 ; rm /tmp/startdelay ) &
[ -f /tmp/noautostart ] && exit 0
start_app
Se eseguo l'accesso ed eseguo touch /tmp/noautostart
l'app principale non si avvierà. Se il cane da guardia interviene, rm /tmp/startdelay
non verrà eseguito e al successivo avvio del sistema, mi daranno 30 secondi in più per fermarlo. Altrimenti il riavvio sarà rapido, senza indugio.
&
sullo sfondo il sleep; "è necessario anche lo sfondo del sonno" era in prima linea dall'inizio. Se non mi credi, guarda la cronologia delle modifiche. E la mia risposta è di 5 minuti più vecchia della tua: P
()
gruppo, la shell originale si fermerà fino a quando quella generata termina.)
usa il at
comando
echo "echo \"80\" > /sys/class/leds/blue/brightness" | at now + 5 min
che verrà eseguito in background
echo
tutto usando un heredoc o un herestring.
at
è un comando POSIX standard. Quale sistema simile a Unix non lo ha disponibile per impostazione predefinita?
Se vuoi eseguire qualcosa in 5 minuti, ma il resto del programma continua (o termina), devi anche mettere in background il sonno:
#!/bin/bash
runWithDelay () {
sleep $1;
shift;
"${@}";
}
runWithDelay 3 echo world &
echo hello
Questo verrà stampato hello
e quindi 3 secondi dopo (una volta terminato il programma principale), verrà stampato world
.
La parte importante è il &
fork dell'esecuzione della funzione in background.
runWithDelay () { sleep $1; "${@:2}"; }
invece?
doWhateverWithDelay 3 &
nel tuo secondo esempio.
$@
è che puoi citarlo e verrà espanso come elenco di parole tra virgolette. Quindi meglio farlo "$@"
(o "${@}"
se ti piacciono le parentesi graffe). Vedi pastebin.com/MU7hbB2C
-n
), ma ovviamente era un po 'ingenuo.