Comando de sono demorado não está funcionando no script -- adb campo com 5.1-lollipop campo com sleep campo com init.d campo com mksh camp android Relacionado O problema

Lengthy sleep command not working in script


1
vote

problema

português

Eu escrevi um script abcdefghijklmnsu.d para periodicamente (a cada 4 horas) Backup de dados de um aplicativo usando um comando

  #!/system/bin/sh  (   # Wait for boot to complete   until [ "$(getprop sys.boot_completed)" ]   do     sleep 300   done    while true   do     (       new_dir="/storage/emulated/0/temp/AppData/$(date '+%Y%m%d-%H%M')"       mkdir -p $new_dir       cp /data/data/com.example.app/files/*.json $new_dir        echo "$(date '+%F %T') | app data backup OK!" >> /storage/emulated/0/su.d.log     ) &      sleep 14400 # 4 hours   done ) &    

Na prática, o script backup dos dados somente após a inicialização, nem a cada 4 horas.

No entanto, se eu digitar um shell remoto via adb e deixá-lo sozinho, os dados serão submetidos a cada 4 horas.

Como posso forçar o backup periódico sem estar permanentemente conectado a um PC? (E por que não funciona como esperado?)


edits

    . O comentário
  1. @irfan Latif me deu a ideia de tentar um intérprete diferente (ash da busybox - #!/system/xbin/sh ), mas o resultado foi o mesmo. Vou tentar a sugestão da daemonise do @ mirabilos ( sh -T- -c '...' ) em seguida.

  2. Tentei a sugestão da daemonise da @ Mirabilos com o mesmo resultado: backup de dados somente após a inicialização.

  3. tentou nohup :

      nohup /system/bin/sh -T- -c '...' >/dev/null 2>&1 &    

    mesmo resultado.

english

I've written a su.d script to periodically (every 4 hours) back up data from an app using a looped sleep command:

#!/system/bin/sh  (   # Wait for boot to complete   until [ "$(getprop sys.boot_completed)" ]   do     sleep 300   done    while true   do     (       new_dir="/storage/emulated/0/temp/AppData/$(date '+%Y%m%d-%H%M')"       mkdir -p $new_dir       cp /data/data/com.example.app/files/*.json $new_dir        echo "$(date '+%F %T') | app data backup OK!" >> /storage/emulated/0/su.d.log     ) &      sleep 14400 # 4 hours   done ) & 

In practice, the script backs up the data only after bootxe2x80x94not every 4 hours.

However, if I enter a remote shell via adb and leave it alone, then the data does get backed up every 4 hours.

How can I force the periodic backup without being permanently connected to a PC? (And why isn't it working as expected?)


EDITS

  1. @Irfan Latif's comment gave me the idea of trying a different interpreter (busybox ash - #!/system/xbin/sh), but the result was the same. I'll try @mirabilos's daemonise suggestion (sh -T- -c '...') next.

  2. Tried @mirabilos's daemonise suggestion with the same result: backs up data only after boot.

  3. Tried nohup:

    nohup /system/bin/sh -T- -c '...' >/dev/null 2>&1 & 

    Same result.

              
     
     

Lista de respostas

3
 
vote

Se é a coisa do terminal @irfanlatif escreveu, tente isto:

  #!/system/bin/sh # run a command block in the background, detached from all terminals /system/bin/sh -T- -c '     # Wait for boot to complete     until [ "$(getprop sys.boot_completed)" ]; do         sleep 300     done      while true; do         (             new_dir="/storage/emulated/0/temp/AppData/$(date '''+%Y%m%d-%H%M''')"             mkdir -p "$new_dir"             cp /data/data/com.example.app/files/*.json "$new_dir"              echo "$(date '''+%F %T''') | app data backup OK!" >>/storage/emulated/0/su.d.log         ) &          sleep 14400 # 4 hours     done '    

o -T- a opção informa ao shell para daemon() ise, ou seja, substituir stdin, stdout, stderr com mksh e duploif comando em segundo plano. Talvez isso ajude.

Eu não tenho uma ideia off-hand por que isso não funcionaria. Divulgação Completa: Eu sou o ABCDEFGHIJKLMNABCDEFGHIJKLMN4 Desenvolvedor.

 

If itxe2x80x99s the terminal thing @IrfanLatif wrote, try this:

#!/system/bin/sh # run a command block in the background, detached from all terminals /system/bin/sh -T- -c '     # Wait for boot to complete     until [ "$(getprop sys.boot_completed)" ]; do         sleep 300     done      while true; do         (             new_dir="/storage/emulated/0/temp/AppData/$(date '\''+%Y%m%d-%H%M'\'')"             mkdir -p "$new_dir"             cp /data/data/com.example.app/files/*.json "$new_dir"              echo "$(date '\''+%F %T'\'') | app data backup OK!" >>/storage/emulated/0/su.d.log         ) &          sleep 14400 # 4 hours     done ' 

The -T- option tells the shell to daemon()ise, that is, replace stdin, stdout, stderr with /dev/null and double-fork the command into the background. Perhaps this helps.

I donxe2x80x99t have an off-hand idea why this would otherwise not work. Full disclosure: Ixe2x80x99m the mksh developer.

 
 
1
 
vote
vote
Melhor resposta
 

Não tendo sucesso com sleep , eu acabei indo o crond rota, como sugerido por @irfan latif:

  • /system/su.d/99crond (-rwx------ root root)

      #!/system/bin/sh  # File: 99crond # Desc: Start cron daemon  (   # Wait for boot to complete   until [ "$(getprop sys.boot_completed)" ]   do     sleep 2   done    # Symlink default cron dir to /data/local/crontabs   mount -o remount,rw /   mkdir -p /var/spool/cron   ln -s /data/local/crontabs /var/spool/cron/crontabs   mount -o remount,ro /    crond -b    echo "$(date '+%F %T') | su.d/99crond OK!" >> /storage/emulated/0/su.d.log ) &    
  • /data/local/crontabs/root (-rw------- root root)

      -T-0   

    Leitura adicional

    • cronhowto
    • Qual é a sintaxe correta para executar Cron a cada 4 horas?
    • crontab (5) - Linux Man Page
  • -T-1

      -T-2   

Como apontado por @Ramast Aqui , esses três arquivos sozinhos não foram suficiente para obter ABCDEFGHIJKLMNABCDEFGHIJKLMN13 < / Código> Trabalhando: abcdefghijklmnabcdefgijklmn14 também é necessário para o usuário raiz ser reconhecido, então ...

  -T-5   

Depois de tudo o que é feito, os dados são revestidos periodicamente conforme desejado.

 

Having no success with sleep, I ended up going the crond route, as suggested by @Irfan Latif:

  • /system/su.d/99crond (-rwx------ root root)

    #!/system/bin/sh  # File: 99crond # Desc: Start cron daemon  (   # Wait for boot to complete   until [ "$(getprop sys.boot_completed)" ]   do     sleep 2   done    # Symlink default cron dir to /data/local/crontabs   mount -o remount,rw /   mkdir -p /var/spool/cron   ln -s /data/local/crontabs /var/spool/cron/crontabs   mount -o remount,ro /    crond -b    echo "$(date '+%F %T') | su.d/99crond OK!" >> /storage/emulated/0/su.d.log ) & 
  • /data/local/crontabs/root (-rw------- root root)

    # /data/local/crontabs/root: Android root user crontab  SHELL=/system/bin/sh PATH=/sbin:/system/bin:/system/xbin:/data/local/bin  #.--------------------------- Minute (M) (0--59) #|    .---------------------- Hour (H) (0--23, 0 = midnight) #|    |     .---------------- Day of Month (DoM) (1--31) #|    |     |     .---------- Month (MON) (1--12) OR jan,feb,mar, ... #|    |     |     |     .---- Day of Week (DoW) (0--6, Sunday = 0 or 7) OR sun,mon,tue, ... #|    |     |     |     | #M    H     DoM   MON   DoW   COMMAND 0     */4   *     *     *     /data/local/bin/cron_backup.sh # 

    FURTHER READING

    • CronHowto
    • What is the correct syntax to run cron every 4 hours?
    • crontab(5) - Linux man page
  • /data/local/bin/cron_backup.sh (-rwxr-xr-x root shell)

    #!/system/bin/sh  # File: cron_backup.sh # Desc: Back up app data (periodically with crond)  new_dir="/storage/emulated/0/temp/AppData/$(date '+%Y%m%d-%H%M')" mkdir -p "$new_dir" cp /data/data/com.example.app/files/*.json "$new_dir"  echo "$(date '+%F %T') | cron_backup.sh OK!" >> /storage/emulated/0/crond.log 

As pointed out by @Ramast here, these three files alone were not quite sufficient to get crond working: /system/etc/passwd is also required for user root to be recognised, so...

mount -o remount,rw /system echo "root:x:0:0:root:/data:/system/bin/sh" >> /system/etc/passwd chmod 644 /system/etc/passwd mount -o remount,ro /system 

After all that is done the data gets backed up periodically as desired.

 
 
1
 
vote

Meu comentário não funciona também. Eu entendi, -T-6 não funciona em seguida, a tela está desligada.

talvez você deve manter o sistema acordado para -T-7 comando para estar funcionando.

 

My comment does not work too. I have understood, sleep does not work then screen is off.

You should perhaps keep the system awaked for sleep command to be working.

 
 

Perguntas relacionadas

4  Posso atualizar as variáveis ​​de ambiente do ADB Shell?  ( Can i update the adb shells environment variables ) 
Eu queria atualizar a variável de ambiente abcdefghgjklmnabcdefghijklmn0 permanentemente no shell adb . Eu adivinhei o shell foi mksh para que eu encontr...

1  Comando de sono demorado não está funcionando no script  ( Lengthy sleep command not working in script ) 
Eu escrevi um script abcdefghijklmnsu.d para periodicamente (a cada 4 horas) Backup de dados de um aplicativo usando um comando #!/system/bin/sh ( # W...

3  Trabalhando para substituição de processo em MKSH  ( Work around for process substitution in mksh ) 
Uma característica extremamente útil do bash, conhecido como Substituição de processo , está faltando na concha do Android, mksh . Isso é altamente lamentáv...

0  Pedido de raiz inesperado para MKSH ao ativar ou desligar o WiFi  ( Unexpected root request for mksh when turning wifi on or off ) 
Desde hoje, vejo o seguinte aviso root ao ligar ou desligar o WiFi: superuser anfrage / Superuser Solicitação: mksh (1000) angefourderter benuter / ...

2  Como usar nomes de arquivos multibyte no shell adb?  ( How to use multibyte file names in adb shell ) 
Eu tenho um Galaxy S6 executando Android 7.0: zeroflte:/ $ getprop ro.build.version.release 7.0 Existe um arquivo que u...

5  Como escrever histórico de shell do Android para arquivar  ( How to write android shell history to file ) 
Usando emulador de terminal para Android , Existe uma maneira de permitir um histórico de comando persistente? Até agora, eu tentei o seguinte: comando...

1  Como verificar se o script é executado quando o dispositivo for inicializado?  ( How to check if script is run once device is booted ) 
Eu tenho um script que eu preciso executar uma vez, e apenas uma vez que o telefone for inicializado. Eu tentei init.qcom.post_boot.sh, init.sec.boot.sh, de...

2  Shell .Profile ou / etc / perfil para Android antigo 2.3.3  ( Shell profile or etc profile for old android 2 3 3 ) 
Apenas enraizado meu telefone antigo com o Android 2.3.3 e gostaria de definir alguns aliases para cada shell que eu começo (com ADB ou APP Terminal). Eu enco...

4  Atualize MKSH para a versão mais recente  ( Update mksh to latest version ) 
Navios Android com ABCDEFGHIJKLMNABCDEFGHIJKLMN10 como Shell, como posso atualizar para a versão mais recente (agora R57, mina ainda em R43)? site oficial...




© 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.