Comment exécuter une commande en arrière-plan avec un délai?

Quelquun peut-il me montrer comment créer un programme pour effectuer cette action: après 5 minutes

echo "80" > /sys/class/leds/blue/brightness 

Je veux que ce programme sexécute en arrière-plan (comme le service rngd). Je ne peux pas le faire parce que je ne connais pas grand chose à Linux.

Réponse

( sleep 300 ; echo "80" > /sys/class/leds/blue/brightness ) & 

De cette façon, votre script continue, ou vous restaurez le contrôle immédiatement, tandis quun nouveau la tâche darrière-plan du script démarre, avec deux commandes: sleep et echo.

Lerreur courante consiste à essayer de donner soit sleep soit echo ou les deux & qui ne fonctionneront pas comme prévu. Le lancement dune série de commandes dans () les engendre dans un processus shell séparé, que vous pouvez ensuite envoyer en arrière-plan avec &.


À cet esprit, où je lai trouvé activement utile. Dans un appareil embarqué que je développe, il y a lapplication principale qui fonctionne avec un chien de garde. Si elle échoue dune manière qui déclenche la réinitialisation du chien de garde peu de temps après le démarrage, à plusieurs reprises, il est difficile de corriger à distance car la période entre le démarrage du système dexploitation et la réinitialisation est assez courte, pas assez pour ssh et bloquer le démarrage de lapplication. Jai donc besoin dun moyen de déterminer si le système a redémarré si rapidement et dintroduire un délai le cas échéant, pour me donner le temps de le réparer manuellement.

 [ -f /tmp/startdelay ] && sleep 30 touch /tmp/startdelay ( sleep 30 ; rm /tmp/startdelay ) & [ -f /tmp/noautostart ] && exit 0 start_app 

Si je connectez-vous et exécutez touch /tmp/noautostart lapplication principale ne démarre pas. Si le chien de garde entre en action, rm /tmp/startdelay ne sera pas exécuté et le suivant au démarrage du système, cela me donnera 30 secondes supplémentaires pour larrêter. Sinon, le redémarrage sera rapide, sans délai.

Commentaires

  • Oui je suis daccord, mais cela peut aussi faire partie de la réflexion de lutilisateur; -)
  • Dautres réponses semblent manquer la partie " en arrière-plan ". Non, je était assez explicite à ce sujet: /
  • @goldilocks: Vous avez ajouté lenvoi en arrière-plan uniquement après avoir publié ma réponse.
  • Non, ma réponse initiale était dexécuter une fonction contenant sleep avec & pour larrière-plan du sommeil; " vous devez également mettre le sommeil en arrière-plan. " était dans la première ligne depuis le début. Si vous ' ne me croyez pas, consultez lhistorique des modifications. Et ma réponse a 5 minutes de plus que la vôtre: P
  • @gekannt: … euh, la question est " Comment exécuter une commande dans larrière-plan avec un retard? " – comment y arriveriez-vous autrement? (et non, si vous ne ' t arrière-plan le groupe (), le shell dorigine se mettra en pause jusquà ce que celui généré se termine.)

Réponse

utilisez la commande at

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

qui sexécutera en arrière-plan

Commentaires

  • Cest la bonne façon de procéder , mais il a besoin du démon atd en cours dexécution et sur la plupart des systèmes, il faudra quun paquet soit installé.
  • Vous pouvez utiliser des guillemets simples pour éviter léchappement, et renoncer à echo en utilisant un heredoc ou un herestring.
  • @Julian, at est une commande POSIX standard. Quel système de type Unix ne ' t-il pas disponible par défaut?
  • @St é phaneChazelas – bonne question . Je sais que jai ' eu ce problème mais cétait il y a quelque temps. Jai fait un peu de vérification et la commande at semble assez omniprésente. Il semble également que atd soit spécifique à Linux et même sur certains systèmes Linux, il peut être remplacé par un démon cron de style BSD. Laissons ' considérer mon commentaire comme obsolète.
  • Jai essayé ' à ' et aucune commande na été trouvée sur Android 8

Réponse

Si vous voulez que quelque chose sexécute dans 5 minutes, mais le reste de votre programme pour continuer (ou terminer), vous devez également mettre en arrière-plan le sommeil:

#!/bin/bash runWithDelay () { sleep $1; shift; "${@}"; } runWithDelay 3 echo world & echo hello 

Cela affichera hello puis 3 secondes plus tard (après la sortie du programme principal), imprimez world.

La partie importante est le & pour bifurquer lexécution de la fonction en arrière-plan.

Commentaires

  • Puis-je suggérer runWithDelay () { sleep $1; "${@:2}"; } à la place?
  • Je le pense devrait lire doWhateverWithDelay 3 & dans votre deuxième exemple.
  • @manatwork: Cheers.
  • @goldilocks, lessentiel pour utiliser $@ est que vous pouvez le citer et sera développé sous forme de liste de mots entre guillemets. Alors mieux vaut le faire "$@" (ou "${@}" si vous aimez les accolades).Voir pastebin.com/MU7hbB2C
  • @manatwork: Point pris;) Jai essayé dutiliser args avec echo (-n), mais cétait évidemment un peu naïf.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *