1 votes

La commande de sommeil prolongé ne fonctionne pas dans le script

J'ai écrit un su.d pour sauvegarder périodiquement (toutes les 4 heures) les données d'une application à l'aide d'un script en boucle. sleep commandement :

#!/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
) &

En pratique, le script ne sauvegarde les données qu'après le démarrage, et non pas toutes les 4 heures.

Cependant, si j'entre dans un shell distant via adb et de ne pas y toucher, les données sont sauvegardées toutes les 4 heures.

Comment puis-je forcer la sauvegarde périodique sans être connecté en permanence à un PC (et pourquoi cela ne fonctionne-t-il pas comme prévu) ?


EDITS

  1. Le commentaire de @Irfan Latif m'a donné l'idée d'essayer un autre interpréteur (busybox ash) - #!/system/xbin/sh ), mais le résultat est le même. Je vais essayer la suggestion daemonise de @mirabilos ( sh -T- -c '...' ) suivant.

  2. J'ai essayé la suggestion daemonise de @mirabilos avec le même résultat : sauvegarde des données seulement après le démarrage.

  3. Essayé nohup :

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

    Même résultat.

3voto

Stu Points 169

S'il s'agit de la chose que @IrfanLatif a écrite sur le terminal, essayez ceci :

#!/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
'

のことです。 -T- indique à l'interpréteur de commandes de daemon() ise, c'est-à-dire remplacer stdin, stdout, stderr par /dev/null et de faire passer le commandement à l'arrière-plan. Cela vous aidera peut-être.

Je n'ai pas la moindre idée de la raison pour laquelle cela ne fonctionnerait pas autrement. Révélation complète : je suis le mksh développeur.

1voto

andronoid Points 41

N'ayant pas eu de succès avec sleep J'ai fini par opter pour l'option crond comme suggéré par @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
    #

    AUTRES LECTURES

  • /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

Comme l'a souligné @Ramast aquí Ces trois dossiers n'ont pas suffi à eux seuls à obtenir le soutien de l'Union européenne. crond de travail : /system/etc/passwd est également nécessaire pour l'utilisateur Racine d'être reconnu, donc...

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

Une fois que tout cela est fait, les données sont sauvegardées périodiquement selon les besoins.

1voto

Ernest Zamelczyk Points 101

Mon commentaire ne fonctionne pas non plus. J'ai compris, sleep ne fonctionne pas, l'écran est éteint.

Vous devriez peut-être garder le système en éveil pendant sleep fonctionne.

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