4

時々、次のようなコマンドを実行する必要があります:

cat file.txt | awk ' NR%4 == 2 { print $1 }' | sort | uniq -c | sort -gr >>output.txt &

大きなファイル (2 ~ 32 GB のサイズ)。夕方にコマンドを開始し、朝になるとoutput.txtが空でプロセスが実行されていないことがあります。

どうすれば何が起こっているのかを追跡できますか? コマンドが失敗した理由と時期 パイプラインが正常に終了する場合があるため、パイプラインが機能していることはわかっています。

どうもありがとう!

更新: この計算を実行しているサーバーはインタラクティブな使用のみが推奨されているため、プロセスが強制終了されたと思います。これが正しい場合、ログファイルから確認できる唯一のことは、成功していない、つまり完了していないということです。

私のプロセスが実際に強制終了されたことを確認する方法はありますか? ありがとう。

4

3 に答える 3

4

最初のステップでは、そのスクリプトを端末で直接実行するのではなく、ファイルにカプセル化します (その過程で UUOC 賞を失います)。

#!/bin/bash

{
awk 'NR%4 == 2 { print $1 }' file.txt | sort | uniq -c | sort -gr >>output.txt
} 2>error.log

これにより、すべてのエラー メッセージがファイルに取り込まれますerror.log。その後、診断情報を追加できます。

#!/bin/bash

{
date >&2
set -x
awk 'NR%4 == 2 { print $1 }' file.txt | sort | uniq -c | sort -gr >>output.txt
date >&2
} 2>error.log

これで、いつ開始され、いつ終了したかという情報が得られました。にいるのでbash、必要に応じてパイプライン内の各プロセスの終了ステータスを取得するように手配できるため、どのコマンドがどのステータスで終了したかを正確に知ることができます。どのプロセスが強制終了されたかについてのメッセージを受け取る場合と受け取らない場合がありますが (プロセスが外部シグナルによって強制終了された場合)、プロセスが自発的に終了した場合は、標準エラーにメッセージを出力する必要があります (それがその目的です。また、エラーを標準出力ではなく標準エラーに出力することが重要である理由)。

このスクリプトを使用すると、標準出力が にoutput.txt、標準エラーが に送信されerror.logます。スクリプトは標準入力を使用しません (データは から取得されますfile.txt)。したがって、これを実行するnohupか、単にバックグラウンドで実行することができます&

file.txt名前をコマンド ライン パラメータにすることをお勧めします。出力ファイルとログ ファイルを構成可能にしたい場合があります。日付出力には別の形式を使用することをお勧めします。そのすべてが微調整可能です。しかし重要な点は、それをシェルスクリプトに入れ、そのようなことを単純かつ体系的に処理できるようにすることです。

于 2013-10-19T18:10:20.280 に答える
2

とを使用screenして、すべてのエラーをキャプチャし、進行状況バーを表示し、エラーが発生したときに最初からではなく、最後に成功したコマンドから再開できるようにします。pvtee

プロセスをバックグラウンド化するのではなくscreen(マルチプレクサー)を使用できます。そうすれば、いつでもそのステータスを確認でき、エラー メッセージを見逃すことはありません。と入力screenして、コマンドを実行し、&を押しますCTRL-a,d。その後、ログアウトできます。後で出力を確認するには、(リモートでも) ログインして、 と入力しscreen -rます。

さらに、イニシャルcatpv(パイプ ビューアー) に置き換えると、既に処理された量を示すプログレス バーが表示されます。

pv -cN file.txt

そして、あなたは次のようなものを見るでしょう

611MB 0:00:11 [58.3MB/s] [=>      ] 15% ETA 0:00:59

screenプロセスを再接続するたびに。

代わりに/補足的にtee、コマンドの後に挿入して、その出力を次のファイルに伝播する前にファイルにコピーすることができます。

uniq -c | tee afteruniq.tmpfile | sort -gr

ファイルafteruniq.tmpfileには の結果が含まれますuniq -c。したがって、何がうまくいき、何が失敗したかがわかります。teeさらに、 'd ファイルからの最後の成功したステップの後にチェーンを再開できます。

于 2013-10-19T18:16:53.723 に答える
0

stderrと の両方をstdout出力ファイルにリダイレクトする必要があります。

コマンドを次のようにします。

( awk 'NR%4 == 2{print $1}' file.txt| sort | uniq -c | sort -gr ) >> output.txt 2>&1 &

どこに行くにも2>&1リダイレクトすることに注意してください。stderrstdout

于 2013-10-19T17:57:48.060 に答える