タイムアウト、パイプとトイレの破壊


20

いくつかの解凍プログラムのベンチマークをすばやく行うというアイデアがありました。たとえば、gzの場合、次のコマンドを実行します。

timeout 10 zcat foo.gz | wc -c

圧縮解除プログラムが10秒で抽出できるデータ量を測定します。

唯一の問題は、それが機能しないことです。zcatが強制終了されると、wcも強制終了されるため、バイトカウントは取得されず、Terminatedメッセージのみが取得されます。

だから、問題は次のとおりです:wcからカウントを取得する方法はありますか?


もちろん、代替手段があります:

  1. 一時ファイルへの書き込み:
    timeout 10 zcat foo.gz > /dev/shm/x ; du -sb /dev/shm/x ; rm -r /dev/shm/x これに伴う問題は、大量のメモリを使用することであり、パフォーマンスが低下する可能性があることです。

  2. 代わりにulimitを使用する:
    ulimit -t 10; zcat foo.gz | wc -c
    これも機能しますが、CPU時間のみを測定するため、I / Oによるスローダウン(圧縮が悪化し、ディスクからより多くのバイトを読み取る必要があるため)は測定されません。

  3. より小さなテストファイルを作成する:
    まあ、これはもちろん動作する可能性があり、最も良いソリューションかもしれません。ただし、これにより多くの一時ファイルが作成されます。


6
「パイプとトイレを壊す」を読んだとき、最初は配管に問題があると思いました!
-dr01

回答:


21

timeoutコマンドをサブシェルに配置して、成功させることができます。

( timeout 10 <command> || true ) | wc -c

3
失敗したコマンドを成功させますか?ああ、これはとても邪悪に見える:D
エラティエル

17
@Erathiel邪悪でありながら微笑みたい?これを試してください(上記と同等):(timeout 10 <command> || :) | wc -c
マルコ

1
サブシェルを使用してみましたが、成功させることは考えませんでした。優れた!
P.ピーター

2

投稿した直後に、プロセスに名前付きパイプを使用することを考えました。

mkfifo /tmp/x; wc -c /tmp/x & timeout 10 zcat foo.gz > /tmp/x &

これはうまくいくようです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.