私の質問への答えが見つかりません:crontab
を実行して再起動しますAndroidを使用してbusybox
(または他の手段)
Crontabを実行しようとしましたが、未知のuid 0について文句を言います。
再起動を実行しようとしましたが、何もしません。
または私は今不可能を求めていますか?
要件
ルートアクセス:再起動またはinit.d configなどのスーパーユーザーコンマ用。 Crondは通常のユーザー権限で実行できます。
Busybox:「crond」サービス用
(オプション)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デーモンを忘れずに再起動してください。
Crondがタイムゾーンに従っていない場合、デバイスのtzdataを更新する必要がある場合があります。
*/1 * * * *でテストして、動作するかどうかを確認する方が良いでしょう。
これは、上記のセフの答えを補完するものです。長すぎるためコメントに入れることができませんでした
/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 /
以上です。それはその後うまくいった
「読み取り専用ファイルシステム」というエラーが発生した場合は、/ systemを読み取り/書き込みとして再マウントする必要があります。
mount -o rw,remount /dev/stl12 /system
完了したら、読み取り専用として再マウントします。
mount -o ro,remount /dev/stl12 /system
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の下で眠りにつくのが好きなので、常に時間通りに実行されないことに注意してください。