受信メールを処理して、仕事でブラックボックス アプリケーションに送信するシステムがあります。高レベルのスクリプトは、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
スクリプトは、何かが読み取られるまで引き続きブロックします。最悪のシナリオでは、これを行う必要があります。