( sleep 300 ; echo "80" > /sys/class/leds/blue/brightness ) &
Ainsi, votre script continue ou vous restaurez le contrôle immédiatement, tandis qu'une nouvelle tâche en arrière-plan du script démarre, avec deux commandes: sommeil et écho.
L'erreur commune est d'essayer de donner à l'un sleep
ou l' autre echo
ou aux deux ce &
qui ne fonctionnera pas comme prévu. Lancer une série de commandes ()
bien que les génère dans un processus shell séparé, que vous pouvez ensuite envoyer en entier en arrière-plan &
.
À cet esprit, où je l'ai trouvé activement utile. Dans un appareil intégré, je développe l'application principale qui fonctionne avec un chien de garde. Si cela échoue de manière à déclencher la réinitialisation du chien de garde peu de temps après le démarrage, il est difficile de le réparer à distance car le délai entre le démarrage du système d'exploitation et la réinitialisation est assez court, pas assez pour ssh et bloquer le démarrage de l'application. Il me faut donc un moyen de déterminer si le système a redémarré si rapidement et d'introduire un délai si c'est le cas, afin de 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 touch /tmp/noautostart
l'application principale ne démarre pas. Si le chien de garde se déclenche, rm /tmp/startdelay
il ne sera pas exécuté et la prochaine fois que le système démarrera, il me donnera 30 secondes supplémentaires pour l'arrêter. Sinon, le redémarrage sera rapide, sans délai.
&
pour arrière plan de dormir; "il faut aussi que vous dormiez dans le sommeil" était dans la première ligne depuis le début. Si vous ne me croyez pas, regardez l'historique d'édition. Et ma réponse a 5 minutes de plus que la vôtre: P()
groupe, le shell original s’arrêtera jusqu’à ce que celui qui est apparu se termine.)utiliser la
at
commandecela fonctionnera en arrière-plan
la source
echo
fuites et renoncer complètement à l'aide d'un heredoc ou herestring.at
est une commande POSIX standard. Quel système de type Unix ne l'a pas disponible par défaut?Si vous voulez que quelque chose s'exécute en 5 minutes, mais que le reste de votre programme continue (ou finisse), vous devez également mettre en veille le sommeil:
Cela imprimera
hello
et ensuite 3 secondes plus tard (après que le programme principal soit terminé), imprimezworld
.La partie importante est
&
de transférer l'exécution de la fonction en arrière-plan.la source
runWithDelay () { sleep $1; "${@:2}"; }
place?doWhateverWithDelay 3 &
dans votre deuxième exemple.$@
est que vous puissiez le citer et qu’il soit étendu en tant que liste de mots cités. Donc mieux le faire"$@"
(ou"${@}"
si vous aimez les accolades). Voir pastebin.com/MU7hbB2C-n
), mais c'était un peu naïf.