背景ストーリー:私は複数のビルドオプションにCMakeを使用するソフトウェアを開発しています。デスクトップビルドシステムで「プロセッサリセット」コマンドを実行すると、プログラムは完全に終了しますが、別のパラメータセットを使用して再起動する必要があります。 (この機能はハードウェアでうまく機能するため、基本的なソースコードを変更したくありません。)
質問:私の質問は、「プロセッサリセットが受信されました」と表示されたときにプログラムのターミナル出力を監視し、プログラムの新しいインスタンスをトリガーする方法です。
ガイドライン
- 私が好む答えはシェルスクリプトでこれを行うことですが、他のアイデアにも開いています。
- 私は再帰を望んでいません。
一般コース
電源投入リセットでプログラムを開始
./program -PO
(プログラムが実行され、出力が端末に印刷されます。)
プロセッサリセットコマンドの送信
プログラムはプロセッサリセットコマンドを受け取り、関連情報を印刷して終了します。
モニター・プログラムは、プロセッサーのリセットにより元のプログラムが終了したことを読み取り、別のフラグを使用してプログラムを再実行します。
./program -PR
私が試したこと
部分的に動作する解決策があります...興味深いです。奇妙なバッファリングが行われているようで、無効にしようとしましたが、成功しませんでした。ただし、プログラムの端末出力を正常に解析し、必要に応じてプロセッサリセットフラグを実行します(ループにないため、一度だけ実行されます)。
stdbuf -o0 -i0 -e0 sudo ./program -PO | tee /dev/tty | (grep "Processor Reset.") | (read && sudo ./program -PR)
レビュー
- 大きなデータの塊をバッファリングしないコードが必要です(出力の生成中にスムーズに書き込むなど)。
- マルチプロセッサのリセットを許可するには、ループに含める必要があります。 (他のリセットを実行するとループが終了します。)
答え1
次のようなシェルスクリプトがあるとしたらどうでしょうか?
$ cat top.bash
#!/bin/bash
echo "launched top.bash"
./fakeprog1.bash | grep -q "Processor Reset Received" && exec ./fakeprog2.bash
あなたは./fakeprog1.bash
あなたのものと交換し./program -PO
、./fakeprog2.bash
あなたのものと交換することができます./program -PR
。
私のバージョンを呼び出すと、次のように実行されます。
$ ./top.bash
launched top.bash
launching /root/453742/fakeprog2.bash
メッセージはエコーされfakeprog1.bash
ますが、grep
ログはファイル+このスクリプトに渡される可能性があるためtee
問題ありません。
答え2
正しい方向を教えてくれてありがとう!
# Start the program with Power-On Reset
# Use tee to print output to terminal and pipe to grep
# grep returns 0 if the string is found
sudo ./program -PO | tee /dev/tty | grep -q "Processor Reset."
# Store the grep exit code in a variable
result="$?"
# If result is 0, grep found the Processor Reset string
if [ "$result" == "0" ]; then
while : ; do
sudo ./program -PR | tee /dev/tty | grep -q "Processor Reset."
result="$?"
# This loop will continue as long as the Processor Reset string is found
# once the program terminates
[ "$result" == "0" ] || break
done
fi