Qualcuno può mostrarmi come creare un programma per eseguire questa azione: dopo 5 minuti
echo "80" > /sys/class/leds/blue/brightness
Voglio che questo programma venga eseguito in background (come il servizio rngd
) Non posso farlo perché non so molto di Linux.
Risposta
( sleep 300 ; echo "80" > /sys/class/leds/blue/brightness ) &
In questo modo lo script continua o ripristini il controllo immediatamente, mentre un nuovo attività in background dello script viene avviata, con due comandi: sleep ed echo.
Lerrore comune è provare a dare sleep
o echo
o entrambi &
che non funzioneranno come previsto. Lavvio di una serie di comandi in ()
li genera in un processo di shell separato, che puoi quindi inviare in background con &
.
A quello spirito, dove lho trovato attivamente utile. In un dispositivo incorporato che sviluppo cè lapplicazione principale che funziona con un watchdog. Se fallisce in un modo che attiva il reset del watchdog subito dopo lavvio, ripetutamente, è difficile risolvere in remoto come il periodo tra lavvio del sistema operativo e il ripristino è piuttosto breve, non sufficiente per eseguire ssh e bloccare lavvio dellapp. Quindi ho bisogno di un modo per determinare il riavvio del sistema così velocemente e introdurre un ritardo se lo ha fatto, per avere il tempo di risolverlo manualmente.
[ -f /tmp/startdelay ] && sleep 30 touch /tmp/startdelay ( sleep 30 ; rm /tmp/startdelay ) & [ -f /tmp/noautostart ] && exit 0 start_app
Se io accedi ed esegui touch /tmp/noautostart
lapp principale non si avvia. Se il watchdog si attiva, rm /tmp/startdelay
non verrà eseguita e la successiva quando il sistema si avvia, mi daranno 30 secondi in più per fermarlo. Altrimenti il riavvio sarà rapido, senza indugio.
Commenti
Risposta
usa il at
comando
echo "echo \"80\" > /sys/class/leds/blue/brightness" | at now + 5 min
che verrà eseguito in background
Commenti
- Questo è il modo giusto per farlo , ma ha bisogno del demone atd in esecuzione e sulla maggior parte dei sistemi dovrà avere un pacchetto installato.
- Puoi usare virgolette singole per evitare lescape e rinunciare a
echo
utilizzando un heredoc o herestring. - @Julian,
at
è un comando POSIX standard. Quale sistema Unix ' non è disponibile per impostazione predefinita? - @St é phaneChazelas – buona domanda . so di ' ho avuto questo problema ma è stato qualche tempo fa. Ho fatto un piccolo controllo e il comando at sembra piuttosto onnipresente. Inoltre sembra che atd sia specifico per Linux e anche su alcuni sistemi Linux potrebbe essere sostituito da un demone cron in stile BSD. Consentiamo a ' di considerare il mio commento obsoleto.
- Ho provato ' a ' e nessun comando è stato trovato su Android 8
Answer
Se vuoi che qualcosa venga eseguito in 5 minuti, ma per il resto del programma per continuare (o finire), devi anche mettere in sottofondo la sospensione:
#!/bin/bash runWithDelay () { sleep $1; shift; "${@}"; } runWithDelay 3 echo world & echo hello
Questo stamperà hello
e 3 secondi dopo (dopo che il programma principale è terminato), stampa world
.
La parte importante è &
per eseguire il fork dellesecuzione della funzione in background.
Commenti
- Posso suggerire
runWithDelay () { sleep $1; "${@:2}"; }
invece? - Penso di sì dovrebbe leggere
doWhateverWithDelay 3 &
nel secondo esempio. - @manatwork: Cheers.
- @goldilocks, lessenziale nellutilizzo di
$@
è che puoi citarla e verrà espansa come un elenco di parole citate. Quindi è meglio che sia"$@"
(o"${@}"
se ti piacciono le parentesi graffe).Vedi pastebin.com/MU7hbB2C - @manatwork: Point taken;) Lho provato usando args con echo (
-n
), ma ovviamente era un po ingenuo.
&
come sfondo del sonno; " devi impostare lo sfondo anche per la sospensione " si trovava nella prima riga dallinizio. Se ' non mi credi, guarda la cronologia delle modifiche. E la mia risposta è 5 minuti più vecchia della tua: P()
, la shell originale si fermerà fino al termine di quella generata).