そのため、組み込みの Linux ARM プラットフォームで実行されている、画面のないインタラクティブなプログラムがあり、変更することはできません。それと対話するには、組み込みのLinuxディストリビューションにsshし、組み込みコマンドを使用したある種のカスタムコマンドラインであるプログラムを実行する必要があります。プログラムは終了せず、SIGINTのみがプログラムを終了します。
バックグラウンドで実行し、このようなSSHコマンドを送信してパイプを使用して通信できるようにすることで自動化しようとしていますssh user@host echo "command" > stdinpipe
。この部分は機能します。シェルスクリプトで次のような例が提供されています(bashは使用できません。マシンにはashしかインストールされていません):
#!/bin/sh
mkfifo somePipe
/proc/<PID>/exe < somePipe 2>&1 &
次のようにパイプに書き込むことで、プログラムを簡単にコマンドできるようになりました
echo "command" > somePipe
ターミナル内のすべてを出力します。問題は、SSH セッションが開いている場合は機能しますが、前述のようにコマンドを 1 つずつ送信するだけでは機能しないことです (念のため、exec_command()
メソッドで Python で paramiko を使用していますが、 'それは関係ないと思います。使用できますinvoke_session()
が、対処する必要はありませんrecv()
)
そこで、プログラムの出力をパイプにリダイレクトすることにしました。そこで問題が発生します。私の最初の試みはこれでした(すべてがルートとして実行され、ルートホームフォルダーに保存されているという事実を無視してください。それが私が取得した方法であり、今はそれをきれいにする時間がありません。さらに、私はソフトウェアを管理する 1 つ) :
cd /root/binary
mkfifo outpipe
mkfifo inpipe
./command_bin &
# find PID automatically
command_pid=$(ps -a | egrep ' * \.\/command_bin *' | grep -v grep | awk '{print $1}')
/proc/${command_pid}/exe < inpipe 2>&1 &
echo "process ./command_bin running on PID ${command_pid}"
それだけで端末自体の中で機能します。ここで、SSH セッションを開いたまま別のターミナルを開いて入力するとssh root@host "echo command > /root/binary/inpipe"
、コードが実行されますが、入力したばかりのコマンドとその結果が、開いたままの他のターミナルに出力されます。したがって、明らかにオプションではありません。何らかの方法で出力をキャプチャする必要があります。
プログラムが起動しないように変更./command_bin &
し./command_bin >outpipe &
た場合、理由$command_pid
がわかりません。空であるため、プロセスを見つけることができません。ps -A
代わりにプログラムの開始に置き換える/proc/${command_pid}/exe < inpipe 2>&1 &
と、スクリプトの実行が終了したとき/proc/${command_pid}/exe < inpipe &>outpipe &
に inpipe に問題なく書き込むことができますが、echo "command" > inpipe
いずれかを試してみると、ハングして何もしません。コマンドの開始時に使用してみましたが、実際には役に立ちません。fifo の代わりに通常のファイルを使用して出力をリダイレクトしようとしましたが、結果はまったく同じでした。cat < outpipe
tail outpipe
nohup
私はこのことに一日中費やしましたが、それを機能させることができません。なぜこれが機能しないのですか? また、私はおそらくこれを行うためにひどい方法を使用しているだけですが、他に方法はありますか? ここで必須なのは、ssh 経由でボードに接続する必要があることと、オンボード デバイスと通信しているため (I2C、OneWire プロトコルなどを使用)、コマンド ライン ユーティリティを開いたままにしておく必要があることだけです。
簡単にするために、いつでもプログラムの標準入力に書き込めるようにし、その標準出力を別の場所(ファイル、バッファ、気にしない)に移動させて、後で任意の時間後に簡単に取得できるようにしたいと考えていますcat、tail、またはsshを使用したその他のコマンド。