3日以上実行された次のスクリプトがあります。
seq -w 1 1000000 | while read i; do (./myscript.pl $i >> output.txt); done
シーケンスがどれくらい進んだのかわかりますか?
答え1
要素ごとに異なるパラメータを使用してコマンドを呼び出すので、そのコマンドが現在どのパラメータを処理しているかを確認してください。
ps w -C myscript.pl
write
プロセスが実行しているシステムコールの数を確認して、おおよその値を取得できますseq
。pgrep seq
(または他のコマンド、たとえばps uw -C seq
複数のプロセスがあり、seq
必要なプロセスを識別する必要がある場合)を使用してプロセスIDを見つけます。 PIDが1234
あれば
grep syscw /proc/1234/io
プロセスの一部のIO統計を読んでください。/proc
1. この値に1²を加え、getconf PIPE_BUF /
4096を掛けて書き込んだバイト数を取得しますseq
。これまでに書いたすべての数字の合計長さです。同じ幅の行を印刷しようとしているので、8で割ってこれまでに書かれた数字を取得します。
どのくらいの距離を移動したかを確認するseq
より便利な方法は次のとおりです。システムコールの追跡strace
。 Ubuntuでは、これを行うにはデフォルトでrootが必要です。
$ strace -p1234
strace: Process 1234 attached
write(1, "0008193\n0008194\n0008195\n0008196\n"..., 4096^Cstrace: Process 1234 detached
上記の例では、seq
読み取り側で8192処理を完了し、より多くのデータを処理する準備が整ったら、8193がパイプに書き込まれる次の番号です。
1一般ファイルが記録されている場合、またははファイルのオフセット、つまり記録されたバイト数を表示します。ただし、パイプを使用するとこの情報を取得できません。seq
cat /proc/1234/1/fdinfo
lsof -p1234
seq
²実験によって決定されました。なぜ最初の書き込み操作が2回記録されるのかわかりませんPIPE_BUF
。
答え2
あなたのスクリプトが何をしているのかわかりませんが、watch cat output.txt
他の端末で出力ファイルがどのように見えるかを監視できますか?
または(これはあなたが要求したものではないことを知っています)、次のようにコマンドを実行することもできます。
seq -w 1 1000000 | while read i; do (./myscript.pl $i >> output.txt & echo i); done
または
seq -w 1 1000000 | while read i; do (./myscript.pl $i tee -a output.txt); done
答え3
seq -w 1 1000000 | pv -lcs 1M |
while read i; do (./myscript.pl $i >> output.txt); done
...次のように出力されます。標準エラーエラー率読み取られた行の数と完了した行の現在の割合を示す継続的に更新される進行状況バー。