Linuxでプログラム出力をファイルに保存する際の制限事項

Linuxでプログラム出力をファイルに保存する際の制限事項

以下が利用可能であることを知っています。

$ my_program > output.txt

出力をファイルにリダイレクトする問題は、ファイルが64に達すると、もはやKbファイルに何も書き込まれなくなり、その後のすべての情報が失われることです。

どうですか?

答え1

出力を確認してくださいulimit -f。現在のファイル制限値によって制限される可能性があります。その場合は、実行して制限を削除できますulimit -f unlimited

答え2

シェルはいくつかの内部制限を使用します。 Bash(使用中のシェル)では、このコマンドはulimitリストを一覧表示するために使用されます(-aはすべてを意味します)。

$ ulimit -a

>しかし、「パイプサイズ」(redirect()またはパイプ()の制限)を|より低い値に設定しても、このLinuxシステムでは8(-p)に設定されていても、ストリームのサイズと転送されるデータがパイプを通るサイズは非常に大きい場合があります(1000万バイト以上)。

$ printf '%0*d' 11000111 0 | wc -c
11000111

パイプに適用される別の制限事項であり、実際の制限事項は、以下で読むことです。

$ cat /proc/sys/fs/pipe-max-size
65536

同じファイルに設定します。

$ sudo echo $((4 * 1024)) > /proc/sys/fs/pipe-max-size

ただし、上記で設定した非常に小さい値であっても、パイプの流れを制限するものではありません。上記のコマンドはまだ1000万バイト以上で動作します。
その理由は、制限が適用される理由です。一つブロックを転送できます。

このようなツールが必要です。PerlとBashを混ぜたスクリプト書く一つ詰まった。

$ ./pipesize 128 1
write size:        128; bytes successfully before error: 4096

これはパイプラインの実際の制限を示しています(リダイレクトと同じ制限)。

関連情報