私が持っているスクリプトを作成しようとしています:
tcpdump (options) | fgrep (options) > file
CTRL + CIでtcpdumpを終了した後、これらのコマンドを実行したい:
sed (options) file | awk (options)
wait
rm file
最初の部分は完了していますが、CTRL + CI を押すとプロンプトが表示されます。同じ問題をトラップSIGINTで待機してみました。
ここで、明らかに邪魔にならないようにします。中間のフィルタリングされていない出力を一時ファイルにダンプせずに、単純にすべてをパイプしてみませんか? 試してみましたが、画面出力で情報が失われているようです (サーバーがビジー状態、わかりません)。このようにコマンドを分割すると、完全な出力が得られることがわかりました。
更新:以下の回答に基づいて、次のようにしてみました。これが最も安全な方法のようです。
function1 ()
{
tcpdump (options) | fgrep (options) > file
trap "function2" SIGINT SIGTERM
}
function2 ()
{
sed (options) file | awk (options)
wait
rm -i file
}
うまくいきません。「ファイル」が生成されますが、その内容は sed | によって読み取られ、フィルタリングされていないようです。CTRL+C を実行した後の awk 構文は、rm コマンドによっても削除されていないため、これは、トラップされたセカンダリ関数が実行されていないことのさらなる証拠です。この動作がわかりません。何か間違っていますか?
更新 2:適切に動作させる唯一の方法は次のとおりです。
set -m
tcpdump (options) | fgrep (options) > filename &
trap "kill -9 $!" SIGINT
sed (options) filename | mawk (options)
\rm filename
しかし、バックグラウンド プロセスの強制終了による出力を抑制することができず、見つけたすべての解決策を試し ました。Bash Scripting を使用して、コマンドからのすべての出力を抑制するにはどうすればよいですか? -ここからのすべてのバリアントは機能しません。何をしても出力が得られます。$! を定義してみました。別の変数を使用して、/dev/null のすべてのバリアントを試し、trap コマンド内に配置しようとしましたが、役に立ちませんでした。