3

受信メールを処理して、仕事でブラックボックス アプリケーションに送信するシステムがあります。高レベルのスクリプトは、inittab によって常に実行されるように維持され、子スクリプトを実行して、このコマンドで実際の作業を行います。

$SCRIPT | nc -l -p $PORT

スクリプト自体は、名前付きパイプから読み取り、データの解析と処理を少し行ってechoから、netcat を介して $PORT に接続されたプロセスにデータをシャッフルして戻します。

必要なのは、パイプの遠端からの受信データを処理する方法です。アプリケーション内で接続を閉じる要求を行うと、文字列が返され (好きなように定義できます)、スクリプトがパイプを閉じるのを待ちます。私は現在、相手側から受信データを読み取る機能を追加する方法を理解するのに苦労しています。パイプを閉じるコマンドであることを確認してから、スクリプトを終了します。

私のスクリプトは(一言で言えば)次のようになります。

while true ; do
  email_input="`cat "$pipe"`"
  if [[ $email_input =~ .*escape_queue.* ]] ; then
    break;
  fi
  echo "`parse`"
done

cat $pipeプログラムフローを変更しなければならない可能性はありますが、新しい電子メールが処理のために受信されるまでスクリプトがブロックされるため、非同期で受信するデータを読み取る方法について頭を悩ませることはできません。

明確でない場合、私は bash スクリプトの初心者レベルであり、改善のための提案をいつでも受け付けています。

更新 スクリプト呼び出しをに変更しました

$SCRIPT | nc -l -p $PORT > $nc_data

そしてスクリプト自体の中で

netcat_response="`cat "$nc_data"`";
if [[ "$netcat_response" =~ "exit" ]] ; then
  cat /dev/null > $nc_data
  break;
fi

この時点で、新しいメッセージが fifo にパイプされると、スクリプトは終了します。これは、スクリプトによって読み取られてスクリプトが終了すると、常に 1 つのメッセージが失われることを意味します。catスクリプトは、何かが読み取られるまで引き続きブロックします。最悪のシナリオでは、これを行う必要があります。

4

1 に答える 1

3

stdin の EOF から一定時間後に nc を終了させることができます。

$SCRIPT | nc -l -q 5 -p $PORT > $nc_data

-q一定の秒数後に終了するオプションです。

于 2012-05-18T17:34:38.340 に答える