Je souhaite exécuter une commande toutes les 10 secondes et l'exécuter en arrière-plan (éliminant ainsi watch
?). Toutes les réponses montrent quelque chose comme ce qui suit, mais cela s'exécutera de 11 à 14 secondes. Comment cela peut-il être accompli?
while true; do
# perform command that takes between 1 and 4 seconds
sleep 10
done
Réponses:
Que diriez-vous:
ETA: Avec tous ces commentaires, alternatives et le sous-shell pour une protection supplémentaire, cela semble beaucoup plus compliqué qu'il ne l'avait commencé. Donc, à titre de comparaison, voici à quoi cela ressemblait avant de commencer à m'inquiéter
wait
oukill
, avec leur$!
besoin d'isolement:Le reste est vraiment juste pour quand vous en avez besoin.
la source
$!
: "S'étend à l'ID de processus du travail le plus récemment placé en arrière-plan", et lesleep
n'est pas placé en arrière-plan, donc non, il ne le fera pas. :)Vous pouvez faire quelque chose comme ce qui suit dans
bash
,zsh
ouksh
:Voici ce que
bash
dit le manuel$SECONDS
:Voici un exemple de travail:
la source
SECONDS
fairesleep "$((10-(($SECONDS-$start_time)%10)))"
. Vous devrez fairestart_time=$SECONDS
avant la boucle.SECONDS
. La génération d'un sous-shell comme dans votre dernière édition devrait également éviter ce problème.while true
boucle, je ne pensais pas qu'un état shell devait y survivre. Envelopper une boucle comme ça dans son propre contexte est généralement la meilleure pratique, de toute façon. Dans une situation comme celle-là, je serais plus préoccupé de le faire pourtrap
le plaisir que pour$SECONDS
le plaisir.BASH uniquement - Vous pouvez également calculer le temps passé par votre commande et soustraire de 10:
De l'homme BASH:
la source