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?4 réponses
exigences
accès Root: pour les commades superutilisateurs comme reboot, ou init.d config. Crond peut toujours être exécuté sous des privs utilisateur normaux.
Busybox: pour les crond service
(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.
si le crond n'obéit pas à votre fuseau horaire, vous devrez peut-être mettre à jour les tzdata de votre périphérique.
Mieux de tester avec */1 * * * * pour voir si elle fonctionne.
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
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.
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