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 en utilisant busybox (ou autre)

essayé de lancer crontab, et il se plaint de l'inconnu uid 0.

Essayé de redémarrer, et il ne fait rien.

<!-Ou je demande l'impossible en ce moment?

17
demandé sur Maroun 2013-05-25 12:42:01

4 réponses

exigences

  1. accès Root: pour les commades superutilisateurs comme reboot, ou init.d config. Crond peut toujours être exécuté sous des privs utilisateur normaux.

  2. Busybox: pour les crond service

  3. (optionnel) init.d support: pour démarrer le service "crond" au démarrage. Ou commencer par Magisk post-fs-données.d script.

Création de tâche cron

créer le fichier cronjob dans le répertoire /data/ crontab / (ce pourrait être n'importe quel répertoire accessible même dans sdcard) avec nom de fichier 'root'. Ecrivez votre cronjob dans le fichier 'root'.

echo '

53 * * * * redémarrage " > > /data/crontab/root

tester sans redémarrer

ouvrez maintenant n'importe quel émulateur de terminal dans l'appareil et exécutez les commandes suivantes..

su -

crond-b-c / data / crontab

maintenant le service crond va démarrer,pour vérifier le type...

pgrep-l crond Ou, ps / grep crond

Démarrer crond au démarrage

créer un fichier à /system/etc/init.d avec la permission exécutable:

echo '

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

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

exemple cronjobs

53 * * * * reboot

redémarrera votre appareil à la 53ème minute de chaque heure.

Remarque: 1. Si vous modifiez crontab, n'oubliez pas de redémarrer démon crond après avoir tué l'existant.

  1. si le crond n'obéit pas à votre fuseau horaire, vous devrez peut-être mettre à jour les tzdata de votre périphérique.

  2. Mieux de tester avec */1 * * * * pour voir si elle fonctionne.

19
répondu Seff 2018-08-27 07:35:24

si vous avez une erreur "read only file system", vous devez recompter le /system comme read-write:

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

une fois terminé, remonter en lecture seule:

mount -o ro,remount /dev/stl12 /system
0
répondu janis 2014-01-02 11:33:30

Vous aurez probablement besoin de 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 à la chaîne timezone et assurez-vous que crond l'ait. Je l'AI sous contrôle d'un environnement GUI, et utilise ce qui suit pour obtenir le fuseau horaire (peut ne pas être 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 (root) et appartenant également à cet utilisateur. Si vous définissez la crontab sur votre stockage interne de sorte que vous pouvez l'éditer avec des éditeurs de texte Android, vous pouvez en faire un lien symbolique vers /data/media/0. I use / system / etc / crontabs / root - > / data / media / 0/Cron / master

vous utilisez /data / media et / storage ou / sdcard parce que ce dernier est un système de fichiers fusible qui cache les permissions et la propriété du système de fichiers Unix sous-jacent, donc vous devez définir la propriété sur le système de fichiers réel dans /données.

si vous avez un Android plus ancien qui utilise Fat ou YAFFS ou n'importe quoi pour le stockage interne, alors vous pourriez avoir à garder vos crontabs dans /system

attention que cron ne fonctionne pas toujours à l'heure sous Android car il aime dormir trop.

0
répondu Evan Langlois 2016-01-13 04:59:13

il s'agit d'un complément à la réponse de la Seff ci-dessus. Ne pouvait pas le placer dans un commentaire parce que c'est trop long

/system/etc/init.d n'est pas toujours garanti. Dans mon cas, il n'a pas. Il y a 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 alors crond n'a pas exécuté de travail pour moi. Pour déboguer les erreurs j'ai tué l'instance en cours d'exécution pkill crond et il a couru comme ça

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

Cela fait crond lancer forground et imprimer toutes les informations de débogage. Quand je l'ai lancé 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)

alors j'ai dû créer un fichier passwd avec entrée pour root

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

même alors, il a tout de même échoué avec une erreur comme

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

s'il vous Plaît noter que pas le cas dans ma tâche cron ai-je mentionné "/bin/sh". Cela semble être codé dur dans le binaire.

suivant j'ai ajouté le suivant les lignes de mon script d'initialisation

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

et c'est tout. Cela a bien fonctionné après cela

0
répondu Ramast 2018-06-09 10:26:07