Bash macOS端末Ctrl + Cはすべてのプロセスを終了します。

Bash macOS端末Ctrl + Cはすべてのプロセスを終了します。

rsync出力をカスタム関数にパイプし、それに応じてカスタム情報を出力するために使用したいと思います。

log_output() {
  while read -r dir; do
    last_slash_index=$(echo $dir | awk -F "/" '{print length($0)-length($NF)}')
    echo ${dir:(($last_slash_index))}
  done
}

rsync -avnh "/src/" "/dest" | log_output

この特定のインスタンスから出力されるディレクトリのうち最後のディレクトリには/。停止したctrl+cにもかかわらずrsync(出力に見られるように)、しばらくの間、自分の解析結果が端末に出力されています。を押すと、ctrl+cすべてが終了するようにコードに追加できるものはありますか?

ベストアンサー1

control+の信号は、cフォアグラウンドプロセスグループ内の全てのプロセスが応答するのに時間がかかることがある。特に、システムが非常に使用量が多い場合、またはプロセスがI / Oでブロックされている場合は、そうです。 (これは端末が信号を生成しないように設定されていないと仮定します。詳細については、対応するフラグのドキュメントを参照してtermiosくださいISIG。 。デフォルトではUnixではそうではありません。 「今すぐ停止してください!」が発生したときにファイルが途中に記録されたら、それを停止して出力を壊すことはできますか?しばらく待ってから、I/O が更新されますか?どのくらい?

シグナルハンドラ(trapシェルまたはインターフェイスの上に構築された他のsigaction(2)すべて)は、複雑なフォアグラウンドプロセスグループ(シェルパイプ)と同様に状況を複雑にします。基準としてcontrol+がどのように機能するかを見ることcができ、複雑な作業を行わないでください。yescat

$ yes | cat

ただし、端末がすべての出力を表示しているため、yes応答が遅くなる可能性があります。この要素は以下から削除できます。

$ yes | cat > /dev/null

でも

$ yes > /dev/null

control+への応答が遅い場合、cシステムは別のタスクを実行している可能性がありますか?

そうでなければ、このようなより速い言語でパイピングすると、各bash入力行といくつかの追加コードに対して新しいecho awkパイプラインが生成されます。awkすべての計算を独自に実行するスクリプト(または他のプログラミング言語)に出力をパイプする方が効率的です。ゆっくりとうるさい while readbashこれにより、+controlcより速い応答を取得し、CPUを使用しにくくなります。

$ echo /etc/passwd | awk -F "/" '{print $0, length($0)-length($NF)}'
/etc/passwd 5
$ dir=/etc/passwd; echo ${dir:5}
passwd
$ echo /etc/passwd | awk -F/ '{print $NF}'
passwd

control+で試すもう1つの方法はcもう少し簡単です。

rsync -avnh /src/ /dest | awk -F/ '{print $NF}'

これは、すべてのシェル機能が実行する操作と似ており、はるかにCPU効率的です。

おすすめ記事