2 votes

Android arrête/pause l'exécution de mon script d'arrière-plan ?

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.

5voto

Irfan Latif Points 16863

Android désactive certains processeurs et/ou ne permet pas aux applications de les utiliser lorsqu'il n'est pas nécessaire de les utiliser. somnolent . Il est réalisé grâce à la fonction Groupes de contrôle . L'un des cgroups es cpuset qui contrôle quelle unité centrale est affectée à quel processus. Android crée plusieurs cgroups en cpuset たとえば background , foreground , system-background , top-apps etc.

Les applications sont normalement en background qui peut utiliser le moins de CPU possible - généralement un ou deux. Les services natifs de base tels que vold , zygote (そして system_server ), les services de téléphonie et les applications qui exécutent un service de premier plan (par exemple une notification) ou celles qui sont exemptées de l'optimisation de la batterie ou celles qui ont des privilèges tels que allow-in-power-save sont mis en foreground qui peut utiliser les CPU même lorsque l'appareil est en mode veille.

Vous devez donc ajouter le script à foreground cgroup afin de le maintenir en vie. A partir d'un scénario :

~# echo -n $$ >/dev/cpuset/foreground/tasks

Pour aller encore plus loin, vous pouvez maintenir un verrouillage de réveil afin que l'appareil ne soit pas suspendu :

~# echo -n my_script >/sys/power/wake_lock

N'oubliez pas de le libérer ( echo -n my_script >/sys/power/wake_unlock ) après avoir arrêté le script.

Veuillez noter que ces deux mesures peuvent nuire à la performance de votre batterie, en particulier la dernière. La fonction avertissement :

La création et le maintien de verrous de réveil peuvent avoir un impact considérable sur la durée de vie de la batterie de l'appareil hôte.

androidalle.com

AndroidAlle est une communauté de androiders où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X