( sleep 300 ; echo "80" > /sys/class/leds/blue/brightness ) &
De cette façon, votre script continue, ou vous reprenez le contrôle immédiatement, tandis qu'une nouvelle tâche en arrière-plan du script démarre, avec deux commandes :sleep et echo.
L'erreur courante est d'essayer de donner soit sleep
ou echo
ou les deux le &
qui ne fonctionnera pas comme prévu. Lancement d'une suite de commandes en ()
mais les génère dans un processus shell séparé, que vous pouvez ensuite envoyer en arrière-plan avec &
.
À cet esprit, où je l'ai trouvé activement utile. Dans un appareil embarqué 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 après le démarrage, à plusieurs reprises, il est difficile de réparer à distance car la période entre le démarrage du système d'exploitation et la réinitialisation est assez courte, pas assez pour ssh 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 délai si c'était 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 jeu, rm /tmp/startdelay
ne sera pas exécuté et la prochaine fois que le système démarrera, cela me donnera 30 secondes supplémentaires pour l'arrêter. Sinon, le redémarrage sera rapide, sans délai.
utilisez le at
commande
echo "echo \"80\" > /sys/class/leds/blue/brightness" | at now + 5 min
qui s'exécutera en arrière-plan
Si vous voulez que quelque chose s'exécute en 5 minutes, mais que le reste de votre programme continue (ou se termine), vous devez également mettre en arrière-plan le sommeil :
#!/bin/bash
runWithDelay () {
sleep $1;
shift;
"${@}";
}
runWithDelay 3 echo world &
echo hello
Cela imprimera hello
puis 3 secondes plus tard (après la sortie du programme principal), imprimez world
.
La partie importante est le &
pour bifurquer l'exécution de la fonction en arrière-plan.