背景ストーリー:私は複数のビルドオプションに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
問題ありません。