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?
Conditions requises
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.
Busybox: pour le service 'crond'
(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.
Si le crond n'obéit pas à votre fuseau horaire, vous devrez peut-être mettre à jour le tzdata de votre appareil.
Mieux vaut tester avec */1 * * * * pour voir si cela fonctionne.
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
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
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.