iOS のショートカットはシェルスクリプトを iPhone で実行するようなアクションを起こすことができません。
「SSH 経由でスクリプトを実行」というのはリモートコンピューターでスクリプトを実行するもので、結果は stdout で得られますが、スクリプトを iOS 内で実行はできません。
iSH をインストールすれば Alpine Linux エミュレーターを iPhone で使うことができ、任意のシェルスクリプトを作成して iSH 内で実行できます。
しかし、このときのシェルスクリプトを iPhone のショートカットから実行させることができないのです。
iPhone のショートカットには iPhone 内でショルスクリプトを実行させる仕組みがないのです。
iSH の開始時に自動でシェルスクリプトを実行させることは可能なのですが、2度目以降の開始時には自動実行されません。
これはアプリが終了していないからで、ホームボタンを二度タップ後に現れるアプリリストをスワイプして初めて次の開始時に自動実行されます。
Android の Termux は起動時シェルスクリプト自動実行が可能で、exit 後に再度開けばこれが機能します。
iPhone はこのような動作にはならないので、起動時シェルを設定しても意味がありません。
なお iPhone にはワンタップでアプリを終了させる機能がありません。
そのためかショートカットにアプリを終了させるアクションがない、ということでしょう。
このような、iPhone とそのショートカットの制約(不完全さ、といっても過言ではないでしょう)ゆえにまともな自動化ができません。
Android には Tasker、Macrodroid、Automate などの優れた自動化アプリがありますが、iOS には同等のアプリがありません。
また Termux: Tasker プラグインをインストールすれば Tasker や Macrodroid で任意のシェルスクリプトを実行することができますが、iPhone はこういうことができません。
アップルのポリシーという闇のせいで Android では可能な自動化が同等にはできず、やると違反アプリとして削除されてしまうでしょう。
実は iSH も一度削除の憂き目に会っています。
iOS 上の iSH は自分で終了するコマンドが空振りします。
・exit コマンドは再起動されてしまい、終了しないのです
・poweroff コマンドは空振りします
ベースとなっている Alpine Linux 自体は exit や poweroff で終了します。
これは iOS のせいなのか、iOS 上の iSH の仕様なのかはわかりません。
推定ですが、アップルのポリシーに抵触しないように、iSH 側で「終了」させないようにしているのではないか、と。
なんとも半端な欠陥品ともいえるショートカットであり、iPhone 自体の制約でできないことがもどかしい状態です。
以上のようなこともあって、わたしは iPhone よりも Android の方が好みです。
いずれにせよ、ない知恵を絞り、どうすればシェルスクリプト自動実行を、ショートカットと iSH で代替できるか、を考えてみました。
1.「ある判定」をするシェルスクリプトを組み、cron を使って例えば 10秒ごととか、30秒ごととか、1分ごととかにこのスクリプトを動作させます。
「ある判定」要素はショートカットで設定しますが、ショートカットと iSH シェルスクリプトに共通的に操作可能な要素にします。
例えば、
・特定のファイルが特定のフォルダに存在するか否か
特定ファイル名の変更で「存在」、「非存在」を判定
・特定のファイルの「内容」で判定
・クリップボードの「内容」で判定
など
です。
2.ショートカットで設定された「ある判定」要素が、スクリプトでの判定条件に一致の場合に、「ある判定」を行うスクリプトが「別のスクリプト」を実行するのです。
「別のスクリプト」がショートカットで実行させたい目的のスクリプトです。
こうすることによってショートカットで設定した判定要素に従って目的のスクリプトを実行させることが可能になります。
判定時間間隔は、通常の crontab 設定では最小が1分ですが、crontab 設定を工夫すれば1秒以上の任意の時間間隔で判定するようにできます。
3.以上を実現するために、iSH で cron を使います。
iSH は Alpine Linux のエミュレーターで、crontab と crond は標準で入っています。
iSH はまた、パッケージを追加できますのでコマンドラインでいろいろなことが可能になります。
crontab には次の設定をします。
* * * * * for i in `seq 0 10 59`; do (sleep ${i}; コマンド) & done;
例は 10秒間隔でコマンドを実行します。
コマンド部分は「ある判定」をするシェルスクリプトを設定します。
「ある判定」をするシェルスクリプトはバックグラウンドで動作させますが(& 設定)、これはコマンドの実行にかかる時間が次のコマンド実行開始時間のズレになるのを防止のためです。
判定が一致の場合に「別のスクリプト」を実行するようにし、cron がループ処理に陥らないように「判定条件を不一致」に変更します。
crond の停止は kill $(pidof crond) とするとできます。
これによりシェルスクリプト内で crond を停止処理することができます。
こうすることで任意の時間間隔で「ある判定」が可能になります。
時間間隔を大きくすれば、スクリプト実行までのタイムラグが生じますし、小さくすればタイムラグが少なくて済みますが、あまり小さくするとバッテリー消費が多くなります。
10 〜 30秒程度かな? と。
ーーーーーーーーーーーーーーー
iSH を、iPhone のロック中でも動作させ続けるためバックグラウンド化します。
これは次のおまじないをします。
cat /dev/location > /dev/null &
そして crond をコマンド入力して cron のデーモンを起動します。
ps a で "cat /dev/location" と "crond" タスクの起動状態を確認します。
実は cat /dev/location はバックグラウンド動作のため結構バッテリーを消費します。
これに比べれば crond でのバッテリー消費は大したものではありません。
以上のような、ショートカットと iSH 連携によって、ショートカットのアクションにより、目的のシェルスクリプトが実行できる具体的なやり方は本ブログに記載予定です。
0 件のコメント:
コメントを投稿