web-dev-qa-db-ja.com

Androidでcrontabを使用する方法は?

私の質問への答えが見つかりません:crontabを実行して再起動しますAndroidを使用してbusybox(または他の手段)

Crontabを実行しようとしましたが、未知のuid 0について文句を言います。

再起動を実行しようとしましたが、何もしません。

または私は今不可能を求めていますか?

21
see2851

要件

  1. ルートアクセス:再起動またはinit.d configなどのスーパーユーザーコンマ用。 Crondは通常のユーザー権限で実行できます。

  2. Busybox:「crond」サービス用

  3. (オプション)init.dサポート:ブート時に「crond」サービスを開始します。または、Magisk post-fs-data.dスクリプトを使用して起動します。

cronジョブの作成

ディレクトリ/ data/crontab /にcronjobファイルを作成します(sdcardでもアクセス可能な任意のディレクトリにすることができます)。ファイル名は「root」です。ファイル 'root'内にcronjobを記述します。

エコー '

53 * * * * reboot '>>/data/crontab/root

再起動せずにテスト

デバイスでターミナルエミュレータを開き、次のコマンドを実行します。

su-

crond -b -c/data/crontab

タイプを確認するために、crondサービスが開始されます...

pgrep -l crondまたは、ps | grep crond

ブート時にcrondを起動

/system/etc/init.dに実行可能権限を持つファイルを作成します。

エコー '

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

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

cronジョブの例

53 * * * *再起動

毎時53分にデバイスを再起動します。

注: 1. crontabを変更する場合は、既存のデーモンを強制終了した後、crondデーモンを忘れずに再起動してください。

  1. Crondがタイムゾーンに従っていない場合、デバイスのtzdataを更新する必要がある場合があります。

  2. */1 * * * *でテストして、動作するかどうかを確認する方が良いでしょう。

21
Seff

これは、上記のセフの答えを補完するものです。長すぎるためコメントに入れることができませんでした

/system/etc/init.dは常に機能するとは限りません。私の場合はそうではありませんでした。これがあなたのために機能しなかった場合に備えて、次のリンクで言及されている他の方法があります https://Android.stackexchange.com/questions/6558/how-can-i-run-a-script-on -boot/196785

それでもcrondは私のために仕事をしませんでした。エラーをデバッグするために、実行中のインスタンスを強制終了しましたpkill crondそしてそれをそのように実行しました

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

これにより、crondがフォアグラウンドで実行され、すべてのデバッグ情報が出力されます。そのように実行すると、この警告が表示されました

crond: crond (busybox 1.27.2-Stericson) started, log level 0
crond: ignoring file 'root' (no such user)

そのため、rootのエントリを持つpasswdファイルを作成する必要がありました

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

それでも、それはまだのようなエラーで失敗しました

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

Cronjobの「/ bin/sh」については言及していません。これはバイナリでハードコードされているようです。

次に、initスクリプトに次の行を追加しました

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

以上です。それはその後うまくいった

2
Ramast

「読み取り専用ファイルシステム」というエラーが発生した場合は、/ systemを読み取り/書き込みとして再マウントする必要があります。

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

完了したら、読み取り専用として再マウントします。

mount -o ro,remount /dev/stl12 /system
1
janis

TimeZoneを設定し、rootユーザーを追加する必要があります。 rootユーザーの追加は次のように実行できます。

echo "root:x:0:0::/system/etc/crontabs:/system/bin/sh" > /system/etc/passwd

正しいTimeZone文字列を取得するのは奇妙です。 TZ環境変数をタイムゾーン文字列に設定し、crondが取得することを確認します。私はそれを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)であり、そのユーザーが所有していることを確認してください。 Androidテキストエディターで編集できるように内部ストレージにcrontabを設定した場合、/ data/media/0へのシンボリックリンクにすることができます。/system/etc/を使用しますcrontabs/root->/data/media/0/Cron/master

/ data/mediaと/ storageまたは/ sdcardを使用します。後者は、基礎となるUnixファイルシステムの権限と所有権を隠すFuseファイルシステムであるため、/ dataの実際のファイルシステムに所有権を設定する必要があります。

Fat =またはYAFFSまたは内部ストレージに何でも使用する古いAndroidがある場合は、/ systemにcrontabを保持する必要があります

Cronは、Androidの下で眠りにつくのが好きなので、常に時間通りに実行されないことに注意してください。

0
Evan Langlois