ターミナル出力に基づいて実行可能ファイルを再起動します。

ターミナル出力に基づいて実行可能ファイルを再起動します。

背景ストーリー:私は複数のビルドオプションに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

関連情報