Version courte :
Pourquoi mon script bash (exécuté en arrière-plan, démarré via SSHD) ne s'exécute-t-il pas toutes les ~30 secondes alors qu'il le devrait ? (NOTE : SSHD et le script sont exécutés en tant que Racine !)
J'ai un script que j'utilise pour commencer nohup bash script.sh &
afin qu'il fonctionne en arrière-plan.
Le script est censé vérifier si une application spécifique est connectée à l'aide de la fonction netstat
et si ce n'est pas le cas, il se reconnecte automatiquement en utilisant am start
y input keyevent
. (Cela s'avère toutefois hors de propos).
J'ai remarqué que, bien que le script doive vérifier toutes les 30 secondes (approximativement bien sûr), il met parfois plusieurs minutes à le faire. Je n'arrivais pas à comprendre pourquoi et cela semblait complètement aléatoire (notez que l'écran du téléphone est éteint la plupart du temps et que tout fonctionne en arrière-plan), alors j'ai créé un script de test qui est ce sur quoi la question devrait porter pour plus de simplicité :
#!/bin/sh
while : ; do
echo "$(date +'%Y-%m-%d %H:%M:%S')"
sleep 30
done
C'est tout. Démarrage via nohup bash script.sh &
en utilisant SSHD. Le script ne fait rien d'autre que d'imprimer la date du jour et, grâce à nohup, de l'écrire dans un fichier. J'ai laissé tourner ce script pendant un certain temps, puis j'ai écrit un autre script pour vérifier les résultats et afficher le nombre de secondes chaque fois qu'il est supérieur à 30. Résultat :
134
127
115
127
88
113
116
99
110
116
54
44
70
75
62
82
94
68
429
62
81
126
144
39
467
71
62
Il s'agit de la sortie d'un script qui a fonctionné pendant seulement 4:20 heures, ce qui signifie qu'il y a eu de nombreuses fois où l'exécution a été retardée, où le sommeil a duré plus de 30 secondes, ou quoi que ce soit d'autre....
Quelqu'un peut-il expliquer cela ? Et y a-t-il une solution à ce problème ?
Je pense que cela peut être lié à la mémoire ou à la gestion de l'énergie qui met le script en pause, mais cela ne devrait pas se produire et je voudrais que mon script s'exécute en arrière-plan et s'endorme pendant exactement 30 secondes, sans être mis en pause ou retardé. Dans ce test, la durée la plus élevée a été de 467 secondes, mais la plus élevée que j'ai vue avec le script principal jusqu'à présent a été d'un peu plus de 20 minutes . C'est rare, mais un retard de 5 à 10 minutes se produit quelques fois par jour.