Android pára / pausa execução do meu script de fundo? -- shell campo com ssh campo com scripts campo com bash camp android Relacionado O problema

Android stops/pauses execution of my background script?


2
vote

problema

português

Versão curta:

por que meu script bash (funcionando no fundo, iniciado via sshd) não funcionando a cada ~ 30 segundos quando ele deve? (Nota: sshd e o script está sendo executado como raiz / forte>!)


Eu tenho um script que eu começo a usar nohup bash script.sh & para que seja executado em segundo plano.

O script deve verificar se um aplicativo específico está conectado usando netstat e, se não, ele automaticamente reconectar usando am start e abcdefghijklmn10 . (Isso acaba por ser irrelevante embora).

Eu notei que, embora o script fosse verificar a cada 30 segundos (aproximadamente, é claro), às vezes leva alguns minutos para verificar. Eu não podia realmente descobrir por que e parecia completamente aleatório (note que a tela do telefone está desligada a maior parte do tempo e tudo está funcionando em segundo plano.), Então eu fiz um testscript que é o que a questão deve se concentrar na simplicidade :

  task default: [ :unit_test_and_install, :espresso_test ]  task :unit_test_and_install do     sh './gradlew --console=verbose test installDebug installDebugAndroidTest' end  task :espresso_test do     devices = `adb devices`     serial_numbers = devices.split(" ")[1..-1].map{|q| q.split(" ")[0] }      threads = serial_numbers.map do |sn|         Thread.new do             sh "adb -s #{sn} shell am instrument -w -r -e package com.mycorp.myapp -e disableAnalytics true " +                     "com.mycorp.myapp.test/androidx.test.runner.AndroidJUnitRunner | tee tests_#{sn}.txt"         end     end      threads.each &:join      serial_numbers.each do |sn|         grop = `grep "^OK .*tests" tests_#{sn}.txt`          if grop == ''             sh "cat tests_#{sn}.txt"             abort 'FAILURES on ' + sn         end     end  end 1   

é isso. Iniciado via task default: [ :unit_test_and_install, :espresso_test ] task :unit_test_and_install do sh './gradlew --console=verbose test installDebug installDebugAndroidTest' end task :espresso_test do devices = `adb devices` serial_numbers = devices.split(" ")[1..-1].map{|q| q.split(" ")[0] } threads = serial_numbers.map do |sn| Thread.new do sh "adb -s #{sn} shell am instrument -w -r -e package com.mycorp.myapp -e disableAnalytics true " + "com.mycorp.myapp.test/androidx.test.runner.AndroidJUnitRunner | tee tests_#{sn}.txt" end end threads.each &:join serial_numbers.each do |sn| grop = `grep "^OK .*tests" tests_#{sn}.txt` if grop == '' sh "cat tests_#{sn}.txt" abort 'FAILURES on ' + sn end end end 2 usando o SSHD. O script não faz nada além de imprimir o datetime atual e graças ao Nohup grava-o em um arquivo. Deixei isso em execução por um tempo e depois escrevi outro script para verificar os resultados e imprimir a quantidade de segundos sempre que estiver acima de 30. Resultado:

  task default: [ :unit_test_and_install, :espresso_test ]  task :unit_test_and_install do     sh './gradlew --console=verbose test installDebug installDebugAndroidTest' end  task :espresso_test do     devices = `adb devices`     serial_numbers = devices.split(" ")[1..-1].map{|q| q.split(" ")[0] }      threads = serial_numbers.map do |sn|         Thread.new do             sh "adb -s #{sn} shell am instrument -w -r -e package com.mycorp.myapp -e disableAnalytics true " +                     "com.mycorp.myapp.test/androidx.test.runner.AndroidJUnitRunner | tee tests_#{sn}.txt"         end     end      threads.each &:join      serial_numbers.each do |sn|         grop = `grep "^OK .*tests" tests_#{sn}.txt`          if grop == ''             sh "cat tests_#{sn}.txt"             abort 'FAILURES on ' + sn         end     end  end 3   

Isto é da saída de um script que corrija por apenas 4:20 horas, então muitas vezes em que a execução deve ter sido atrasada, o sono foi maior que 30 segundos, ou o que quer que esteja acontecendo ....

Alguém pode explicar isso? E há uma solução para isso?

Eu suspeito que isso pode ter algo a ver com memória ou gerenciamento de energia pausando o script, mas realmente não deve acontecer e eu gostaria que meu roteiro corra em segundo plano e dormir por exatamente 30 segundos e não ser pausado ou atrasado . Neste testrun, o mais alto foi de 467 segundos, mas o mais alto que já vi com o roteiro principal até agora foi um pouco mais 20 minutos . Isso é raro, mas 5-10 minutos de um atraso acontece algumas vezes por dia.

english

Short version:

Why is my bash script (running in the background, started via SSHD) not running every ~30 seconds when it should? (NOTE: SSHD and the script are running as root!)


I have a script that I start using nohup bash script.sh & so that it runs in the background.

The script is supposed to check whether a specific app is connected using netstat and if not it automatically reconnects using am start and input keyevent. (This turns out to be irrelevant though).

I've noticed that even though the script should check every 30 seconds (roughly of course), sometimes it takes minutes to check. I couldn't really figure out why and it seemed completely random (note that the phone's screen is off most of the time and everything is running in the background.), so I made a testscript which is what the question should focus on for simplicity:

#!/bin/sh while : ; do     echo "$(date +'%Y-%m-%d %H:%M:%S')"     sleep 30 done 

That's it. Started via nohup bash script.sh & using SSHD. The script does nothing but print the current datetime and thanks to nohup writes it to a file. I left this running for a while and then wrote another script to check on the results and print the amount of seconds whenever it's above 30. Result:

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 

This is from the output of a script that ran for only 4:20 hours, so quite a lot of times where execution must have been delayed, the sleep was longer than 30 seconds, or whatever is going on....

Can someone explain this? And is there a solution to this?

I suspect this might have something to do with memory or power management pausing the script but really it shouldn't happen and I would like my script to run in the background and to sleep for exactly 30 seconds and not be paused or delayed. In this testrun, the highest was 467 seconds, but the highest I've seen with the main script so far was a little over 20 minutes. This is rare, but 5-10 minutes of a delay happens a few times a day.

           

Lista de respostas

5
 
vote
vote
Melhor resposta
 

Android desliga algumas das CPUs e / ou não permite que os aplicativos usem quando é cochilando . É conseguido através do Linux Kernel's grupos de controle . Um dos ABCDEFGHIJKLMNABCDEFGHIJKLMN5 é ABCDEFGHIJKLMNABCDEFGHIJKLMN6 que controla qual CPU é atribuído a quais processos. Android cria múltiplos descendentes cgroups em abcdefghijklmnAbcdefghijklmn8 e.g. background , -D0 , -D1 , -D2 etc.

Os aplicativos são normalmente em ABCDEFGHIJKLMNABCDEFGHIJKLMN13 categoria que pode usar menos não. de CPUs - geralmente um ou dois. Serviços nativos do núcleo como -D4 , -D5 (e abcdefghijklmnabcdefgijklmn16 ), serviços de telefonia, e aplicativos que executam um serviço de primeiro plano (por exemplo, notificação) ou aqueles isentos da otimização da bateria ou aqueles que têm privilégios como -D7 são colocados em -D8 grupo que pode usar as CPUs mesmo quando o dispositivo estiver no modo de suspensão.

Então você precisa adicionar o script para -D9 a local "dynamic" application-level port forwarding0 para mantê-lo vivo. De dentro do script:

  a local "dynamic" application-level port forwarding1   

Indo ainda mais agressivo, você pode segurar uma trava de vigília para que o dispositivo não suspenda:

  a local "dynamic" application-level port forwarding2   

Não se esqueça de liberá-lo ( a local "dynamic" application-level port forwarding3 ) depois de parar o script.

Por favor, note que ambas as medidas podem afetar adversamente o desempenho da bateria, particularmente este último. Android's aviso :

.

Criar e manter bloqueios de vigília podem ter um impacto dramático na duração da bateria do dispositivo de host

 

Android turns off some of CPUs and/or don't let apps use them when it's dozing. It's achieved through Linux kernel's Control Groups. One of the cgroups is cpuset that controls which CPU is assigned to which processes. Android creates multiple descendant cgroups in cpuset e.g. background, foreground, system-background, top-apps etc.

Apps are normally in background category which can use least no. of CPUs - usually one or two. Core native services like vold, zygote (and system_server), telephony services, and apps which run a foreground service (e.g. notification) or those exempted from Battery Optimization or those having privileges like allow-in-power-save are put in foreground group which can use CPUs even when device is in sleep mode.

So you need to add the script to foreground cgroup in order to keep it alive. From within script:

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

Going even more aggressive, you can hold a wake lock so that device doesn't suspend:

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

Don't forget to release it (echo -n my_script >/sys/power/wake_unlock) after stopping the script.

Please note that both of these measures can adversely affect your battery performance, particularly the latter. Android's warning:

Creating and holding wake locks can have a dramatic impact on the host device's battery life

 
 
         
         

Perguntas relacionadas

0  Addon.d Bash Script para remover APKS após refluxo noturno no Android 5.1 cm12.1 não funciona  ( Addon d bash script for removing apks after nightly reflash on android 5 1 cm12 ) 
Estou tentando ter um script bash em /system/addon.d/ que remove APKs indesejadas de um Android 5.1 (CM12.1) para o meu telefone Galaxy Nexus. Cada novo refla...

8  Executando aplicativos de um emulador de terminal [fechado]  ( Running applications from a terminal emulator ) 
. FECHADO. Esta questão é off-tópico . Atualmente não está aceitando respostas. Quer melh...

1  Como modificar o prompt de Bash Shell em CyanogenMod?  ( How to modify bash shell prompt in cyanogenmod ) 
Alguém já teve sucesso modificando o prompt do shell em CyanogenMod? Atualmente, # é muito inútil, seria muito melhor, pelo menos exibir o diretório de trabal...

5  Bash - Como posso verificar se um computador existe na minha rede sem ip (i.e. por nome do dispositivo)?  ( Bash how can i check if a computer exists on my network without ip i e by de ) 
Eu gostaria que meu telefone executasse certos scripts de shell via Tasker se meu telefone estiver na mesma rede WiFi como meu laptop. Minha ideia inicial é e...

24  É possível ativar a configuração do Android "USB Tethering" da linha de comando?  ( Is it possible to activate the usb tethering android setting from the command ) 
Eu gostaria de ativar "USB Tethering" de dentro de um script bash, por isso há alguma possibilidade de executar uma linha de comando com adb shell para alte...

1  Terminal de bash em comprimidos  ( Bash terminal on tablets ) 
Eu gostaria de comprar um tablet e usá-lo como um netbook para funcionar usando um dock de teclado (ainda gosto das opções de tela sensível ao toque e caneta ...

0  Alterar arquivo (fotos, vídeos) Timestamp do nome do arquivo  ( Change file pictures videos timestamp from filename ) 
Ao mover arquivos em torno de DIP DIFERENTE DIFT e através do PC / Smartphone, o Timestamp para a data da última modificação geralmente é redefinido para o mu...

11  Como definir Bash como Shell padrão?  ( How to set bash as default shell ) 
Quando eu ADB em um dispositivo com CyanogenMod, sou apresentado com um bom shell bash, prompt de cores e Bashrc. Eu não vejo um symlink de / system / xbin / ...

1  Bash-shell no tablet Android (Transformer Pad TF701T)  ( Bash shell on android tablet transformer pad tf701t ) 
Existe alguma maneira de obter uma concha de bash totalmente trabalhadora no Android juntamente com um emulador de terminal, que suporta um teclado de hardwar...

4  É possível iniciar uma sessão FTP via Bash?  ( Is it possible to start an ftp session via bash ) 
É possível iniciar uma sessão com um smartphone do Android Samsung Galaxy através de um shell bash para acessar arquivos remotamente? ...




© 2022 pergunte.org All Rights Reserved. Casa de perguntas e respostas todos os direitos reservados


Licensed under cc by-sa 3.0 with attribution required.