Как использовать 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 после уничтожения существующего.

  1. Иногда хард может не переводиться в часовой пояс 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, так как ему нравится просыпаться.