web-dev-qa-db-fra.com

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

Quelqu'un 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 s'exécute en arrière-plan (comme le service rngd). Je ne peux pas le faire parce que je ne connais pas tellement Linux.

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

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

L'erreur courante essaie de donner sleep ou echo ou les deux & qui ne fonctionnera pas comme prévu. Lancement d'une série de commandes dans () mais les génère dans un processus Shell séparé, que vous pouvez ensuite envoyer entier en arrière-plan avec &.


Pour cet esprit, où je l'ai trouvé activement utile. Dans un appareil intégré que je développe, il y a l'application principale qui fonctionne avec un chien de garde. S'il échoue d'une 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 d'exploitation et la réinitialisation est assez courte, pas suffisante pour se bloquer et bloquer le démarrage de l'application. J'ai donc besoin d'un moyen de déterminer si le système a redémarré si rapidement et d'introduire un retard si c'est le cas, 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 me connecte et que j'exécute touch /tmp/noautostart l'application principale ne démarre pas. Si le chien de garde entre en action, rm /tmp/startdelay ne sera pas exécuté et au prochain démarrage du système, il me donnera 30 secondes supplémentaires pour l'arrêter. Sinon, le redémarrage sera rapide, sans délai.

56
SF.

utilisez la commande at

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

qui s'exécutera en arrière-plan

11
exussum

Si vous voulez que quelque chose s'exécute en 5 minutes, mais que le reste de votre programme se poursuive (ou se termine), vous devez également définir le sommeil en arrière-plan:

#!/bin/bash

runWithDelay () {
    sleep $1;
    shift;
    "${@}";
}

runWithDelay 3 echo world &
echo hello    

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

La partie importante est le & pour exécuter l'exécution de la fonction en arrière-plan.

6
goldilocks