Как использовать crontab в Android?
Я не могу найти ответ на свой вопрос: возможно ли запустить crontab
для перезагрузки Android с помощью busybox
(или других средств)
Пытался запустить crontab, и он жалуется на неизвестный uid 0.
Попробовал перезагрузить компьютер, и он ничего не делает.
Или я сейчас прошу о невозможности?
Ответы
Ответ 1
Требования
-
Корневой доступ: для суперпользователей, таких как перезагрузка или init.d. Crond все еще может работать под обычными пользовательскими привилегиями.
-
Busybox: для службы "crond"
-
(необязательно) Поддержка init.d: запустить службу "crond" при загрузке
Создание cronjob
Создайте файл cronjob в каталоге/data/crontab/(это может быть любой доступный каталог, даже в sdcard) с именем файла "root".
Напишите свой cronjob внутри файла "root".
echo '
53 * * * * reboot ' → /data/crontab/root
Тест без перезагрузки
Теперь откройте любой эмулятор терминала в устройстве и запустите следующие команды.
su -
crond -b -c/data/crontab
Теперь начнется сервис crond, чтобы проверить тип...
pgrep -l crond Или, ps | grep crond
Начало работы с crond при загрузке
создать файл в /system/etc/init.d с исполняемым разрешением:
echo '
crond -b -c/data/crontab ' > /system/etc/init.d/crond
chmod + x/system/etc/init.d/crond
Пример cronjobs
53 * * * * перезагрузка
Перезагрузите устройство на 53-й минуте каждого часа.
Примечание:
1. Если вы измените crontab, не забудьте перезапустить демон crond после уничтожения существующего.
- Иногда хард может не переводиться в часовой пояс Android, он может использовать UTC вместо этого.
Ответ 2
если вы получите ошибку "только для чтения файловой системы", вам необходимо перемонтировать /system как read-write:
mount -o rw,remount /dev/stl12 /system
Когда закончите, перемонтируйте его как только для чтения:
mount -o ro,remount /dev/stl12 /system
Ответ 3
Вам, скорее всего, нужно будет установить TimeZone и добавить пользователя root. Добавление пользователя root может быть выполнено следующим образом:
echo "root:x:0:0::/system/etc/crontabs:/system/bin/sh" > /system/etc/passwd
Получение правильной строки TimeZone нечетно. Установите переменную среды TZ в строку часового пояса и убедитесь, что она получена от нее. Я имею это под контролем среды GUI и использую следующее для получения TimeZone (может быть, не так, как я еще не тестировал его в других часовых поясах).
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";
}
Также убедитесь, что ваш crontab указан для пользователя (root) и также принадлежит этому пользователю. Если вы установите crontab на своем внутреннем хранилище, чтобы редактировать его с помощью текстовых редакторов Android, вы можете сделать символическую ссылку на /data/media/ 0. Я использую /system/etc/crontabs/root → /data/media/0/Cron/master
Вы используете /data/media и/storage или /sdcard, потому что последняя представляет собой файловую систему FUSE, которая скрывает основные права и права на файловую систему Unix, поэтому вам необходимо установить право собственности на настоящую файловую систему в /data.
Если у вас более старый Android, который использует Fat или YAFFS или что-то еще для внутреннего хранилища, вам, возможно, придется держать свои crontab в /system
Остерегайтесь, что cron не всегда запускается вовремя под Android, так как ему нравится просыпаться.