web-dev-qa-db-fra.com

Comment utiliser crontab dans Android?

Je ne trouve pas de réponse à ma question: Est-il possible d'exécuter crontab pour redémarrer Android à l'aide de busybox (ou d'un autre moyen)

Essayé de lancer crontab, et il se plaint d’inconnu UID 0.

J'ai essayé de redémarrer, et cela ne fait rien.

Ou je demande l'impossible en ce moment?

17
see2851

Conditions requises

  1. Accès racine: pour les commandes de super-utilisateur telles que reboot ou init.d config. Crond peut toujours fonctionner sous des privilèges utilisateur normaux.

  2. Busybox: pour le service 'crond'

  3. (Facultatif) init.d support: pour démarrer le service 'crond' au démarrage. Ou démarrez via le script Magisk post-fs-data.d.

Création de cronjob

Créez le fichier cronjob dans répertoire/data/crontab/(il peut s'agir de n'importe quel répertoire accessible, même dans sdcard) avec le nom de fichier 'root' . Écrivez votre cronjob dans le fichier 'root'.

écho '

53 * * * * reboot '>>/data/crontab/root

Test sans redémarrage

Ouvrez maintenant n'importe quel émulateur de terminal dans le périphérique et exécutez les commandes suivantes.

su -

crond -b -c/data/crontab

Maintenant, le service crond va commencer, pour vérifier le type ...

pgrep -l crond Ou, ps | Grep Crond

Démarrer crond au démarrage

créez un fichier dans /system/etc/init.d avec le droit d’exécution:

écho '

crond -b -c/data/crontab '> /system/etc/init.d/crond

chmod + x /system/etc/init.d/crond

Exemple cronjobs

53 * * * * redémarrage

Réamorcera votre appareil à la 53e minute de chaque heure.

Remarque: 1. Si vous modifiez crontab, pensez à redémarrer le démon crond après avoir supprimé le démon existant.

  1. Si le crond n'obéit pas à votre fuseau horaire, vous devrez peut-être mettre à jour le tzdata de votre appareil.

  2. Mieux vaut tester avec */1 * * * * pour voir si cela fonctionne.

19
Seff

Ceci est un complément à la réponse de Seff ci-dessus ........ Ne peut pas le placer dans un commentaire car il est trop long

/system/etc/init.d n'est pas toujours garanti pour fonctionner. Dans mon cas, cela n'a pas été le cas. Il existe d'autres méthodes mentionnées dans le lien suivant au cas où celle-ci ne fonctionnerait pas pour vous https://Android.stackexchange.com/questions/6558/how-can-i-run-a-script-on-boot/196785

Même à ce moment-là, crond ne m'a exécuté aucun travail . Pour déboguer les erreurs, j'ai tué l'instance en cours pkill crond et je l'ai exécuté comme ça

crond -f -d0 -c /data/crontab/

Ceci fait que crond s’exécute en forground et affiche toutes les informations de débogage . Quand je l’ai exécuté comme ça j’ai eu cet avertissement

crond: crond (busybox 1.27.2-Stericson) started, log level 0
crond: ignoring file 'root' (no such user)

J'ai donc dû créer un fichier passwd avec une entrée pour root

 echo 'root:x:0:0:root:/data:/system/bin/sh' > /system/etc/passwd                                                                                                         

Même alors, il échouait toujours avec une erreur comme

crond:  job: 0 /system/bin/ls
crond: child running /bin/sh
crond: can't execute '/bin/sh' for user root

Veuillez noter que nulle part dans mon cronjob je n’ai mentionné "/ bin/sh". Cela semble être codé en dur dans le binaire.

Ensuite, j'ai ajouté les lignes suivantes à mon script d'initialisation

/system/xbin/mount -o remount,rw /
/system/xbin/ln -s /system/bin/ /bin
/system/xbin/mount -o remount,ro /

et ça y est . Cela a bien fonctionné après cela

1
Ramast

si vous obtenez une erreur "système de fichiers en lecture seule", vous devez remonter le système en lecture/écriture:

mount -o rw,remount /dev/stl12 /system

Une fois terminé, remontez-le en lecture seule:

mount -o ro,remount /dev/stl12 /system
0
janis

Vous devrez probablement définir votre fuseau horaire et ajouter un utilisateur root. Ajouter un utilisateur root peut être fait comme ceci:

echo "root:x:0:0::/system/etc/crontabs:/system/bin/sh" > /system/etc/passwd

Obtenir la bonne chaîne TimeZone est étrange. Définissez la variable d’environnement TZ sur la chaîne timezone et assurez-vous que crond l’obtient. Je l’ai sous le contrôle d’un environnement graphique et j’utilise les éléments suivants pour obtenir le fuseau horaire (il se peut que ce ne soit pas correct car je ne l’ai pas encore testé sur d’autres fuseaux horaires).

public static String findTZS() {
    String date = ZooGate.readShellCommand("date");
    String[] elements = date.split(" ");
    String label = elements[4];
    TimeZone tz = Calendar.getInstance().getTimeZone();
    boolean dlt = tz.useDaylightTime();
    int offset = tz.getDSTSavings()/600000;
    DateFormatSymbols dfs = DateFormatSymbols.getInstance();
    String[][] z = dfs.getZoneStrings();
    for (String[] za: z) {
        if (dlt) {
            if (za[4].equals(label)) {
                return za[2] + offset + za[4];
            } else if (za[2].equals(label)) {
                return za[2] + offset + za[4];
            }
        }
    }
    return "UTC";
}

Assurez-vous également que votre crontab est nommé pour l'utilisateur (racine) et appartient également à cet utilisateur. Si vous définissez la crontab sur votre stockage interne afin de pouvoir la modifier avec les éditeurs de texte Android, vous pouvez en faire un lien symbolique vers/data/media/0. J'utilise/system/etc/crontabs/root ->/data/media/0/Cron/master 

Vous utilisez/data/media et/storage ou/sdcard car cette dernière est un système de fichiers Fuse qui masque les autorisations et la propriété du système de fichiers Unix sous-jacent. Vous devez donc définir la propriété du système de fichiers réel dans/data.

Si vous avez un ancien Android qui utilise Fat ou YAFFS ou autre pour le stockage interne, vous devrez peut-être conserver vos crontabs dans/system

Attention, cron ne fonctionne pas toujours à temps sous Android car il aime dormir trop longtemps.

0
Evan Langlois