Come eseguire un comando in background con un ritardo?

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

  • Sì, sono daccordo, ma può anche essere parte della riflessione dellutente; -)
  • Altre risposte sembrano perdere la parte " in background ". No, io era piuttosto esplicito al riguardo: /
  • @goldilocks: hai aggiunto linvio in parte in background solo dopo che ho pubblicato la mia risposta.
  • No, la mia risposta originale era eseguire una funzione contenente sleep con & 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
  • @gekannt: … uh, la domanda è " Come eseguire un comando in lo sfondo con un ritardo? " – come lo otterresti altrimenti? (e no, se non ' sfondo del gruppo (), la shell originale si fermerà fino al termine di quella generata).

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.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *