結論から言うと原因はわからないため、回避方法の提示となります。
きっかけ
以前の記事でHomebridgeをTermux上で実行しましたが、端末の起動時に実行させるようにしたかったため、MacrodroidとTermux:Taskerを組み合わせて実行することにしました。そこで下に記すようなスクリプトを~/.termux/tasker/に書いて、Termux:Taskerで実行してみました。
#!/data/data/com.termux/files/usr/bin/bash
/data/data/com.termux/files/home/.homebridge/homebridge-run.sh &
これを実行してみたところ、/data/data/com. termux/files/home/.homebridge/homebridge-run.sh: line 4: /data/data /com. termux/files/us/bin/homebridge: cannot execute: required file not foundというエラーが繰り返しでるだけでした。もちろん、手動でスクリプトをTermuxで実行すると、なんのエラーもなく実行できます。不思議です。
Termux:TaskerでHomebridgeを実行しようとすると、なぜか実行できないぞ
— Unagi Dojyou (@Unagi_Dojyou) November 24, 2022
なぜ? pic.twitter.com/kmz5X3dkL6
原因探求
スクリプトがおかしいのかと思って、スクリプト内でbashを表示するよう(下のコード)にしてみましたが、このbash内でもHomebridgeは同様のエラーとなりました。ちなみに他の、ps、vim、lsなどのコマンドはエラーなく実行できました。ユーザも、パスも通常と同じでした。
#!/data/data/com.termux/files/usr/bin/bash
id
echo $PATH
homebridge
bash
他に違いと言ったらログイン時のwelcome to termuxとかのメッセージが流れるかどうかです。これはloginプロセスによって行われます。これに原因があるかもということでそのスクリプトを追加してみました。
#!/data/data/com.termux/files/usr/bin/bash
login
id
echo $PATH
homebridge
bash
loginでコンソールに入ってしまいますが、homebridgeと実行してみると…無事に実行できました。って、ことはlogin時に実行された何かしらの処理が原因のはずなので、/data/data/com.termux/files/usr/etc/下にある、あるとあらゆるスクリプトファイルを実行し、bash.bashrcを読み込んだりしましたが、ダメでした…
回避方法
先程使ったログイン時に実行されるスクリプトを活用します。/data/data/com.termux/files/usr/etc/termux-login.shにはlogin時に記述するとログイン時に実行されるっぽいので、
##
## This script is sourced by /data/data/com.termux/files/usr/bin/login before executing shell.
##
echo start start.sh
/data/data/com.termux/files/home/start.sh
echo end start.sh
と、下3行追記して、/data/data/com.termux/files/home/start.shには
#!/data/data/com.termux/files/usr/bin/bash
#ログイン時に毎回実行されます。
ps=`ps -A | grep start_was_done -o`
if [ -z $ps ]; then
#このif文内部は端末起動後一回しか実行されません。
echo run start.sh
#画面消灯無効化
termux-wake-lock
#sshdの開始
sshd
#homebridgeの開始
.homebridge/home_bridge-run.sh &
./start_was_done.sh &
else
echo stert.sh already done
fi
と記述します。start_was_done.shが実行されているかどうかで、初回起動かどうかを判断します。ってわけでstart_was_done.shには
#!/data/data/com.termux/files/usr/bin/bash
while :
do
sleep 3600
done
と記述しました。ちなみに、.homebridge/home_bridge-run.shの中身は前回の記事の.homebridge/homebridge-run.shです。~/start.shのif文の中に書くことによって、初回起動時に実行可能です。これと、MacroDroidを組み合わせて、端末起動後にTermuxを起動するようにすることによって、起動時に実行可能です。
終わりに
ログインしないといけないってところまでは分かったんですけどねー私の拙い知識では、そこで止まってしまいました。そもそも、実行できないプログラムがnpmで落としてきたプログラムなので、Node.js側の設定の問題の可能性もあります。結構頑張ったんですが、Termux上のHomebridgeがリストラになったので徒労でした。トホホ…