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
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.
&
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()
, le shell dorigine se mettra en pause jusquà ce que celui généré se termine.)