私のウェブサイトのテストロードを生成していますが、このコマンドが実際に何を意味するのかを知りたいです。
('dd if=/dev/zero bs=100M count=500 | gzip | gzip -d > /dev/null &')
これまで私が理解してきたことによれば、これは一度に100MiBのデータチャンクをインポートしてディスクにコピーしてから圧縮および解凍することです。これは正しいと思いますか?
答え1
コマンドを3つの部分に分けてみましょう。
dd if=/dev/zero bs=100M count=500
gzip
gzip -d > /dev/null &
簡潔なバージョン
dd if=/dev/zero bs=100M count=500
それぞれ100MiBの500個のヌル文字チャンク(ASCIIの0x00)をパイプ(|
)に読み込み、本質的に「供給」しますgzip
。ディスクに書き込まないことに注意してください。gzip
データ圧縮gzip -d > /dev/null
解凍してからデータを削除します。
より長い説明
dd if=/dev/zero bs=100M count=500
- この
dd
コマンドには、通常、if
それぞれof
入力ファイルと出力ファイルを表す2つのパラメータがあります。このパラメータは、NULLif
文字の「配列」(ASCIIでは0x00)を返す特別なデバイスファイル/ dev / zeroに設定されます。 - 100MiBチャンクを読むのが正しいです。この
bs
パラメータが役立ちます。ただし、ディスクには書き込まれません。次のトピックを参照してください。 - その
of
引数がない場合は、標準出力またはstdout
(ディスク上のファイルではありません小川)。 Pipe()はコマンドの後に使用されるため、記録され|
たデータはstdout
ここから別のプログラムにパイプ(供給)されます。gzip
- この
count
パラメーターは、コピーするブロック数を指定します。
gzip
- ファイルを指定せずにgzipを実行すると、
stdin
標準入力(この場合はddのパイプ入力)から読み取られ、標準出力に書き込まれます。 - デフォルトでは(
-d
オプションなし)gzipは圧縮を実行します。
gzip -d > /dev/null
- このオプションを使用してgzipを実行すると、
-d
解凍されます。ここでは、gzipからパイプされた入力を読み込み、stdoutに出力します(ファイルが指定されていないため)。 - この
>
文字は現在のコマンドのストリーム(stdout
、、、stdin
)をリダイレクトします。stderr
ここでは、コマンドstdout
の標準出力をgzip -d
デバイスに記録し、記録された/dev/null
すべてのデータを削除します。 - '&'文字は、シェルにバックグラウンドでプロセスを実行するように指示します。
答え2
横に
まず、コマンドが次のようになるとします。
dd if=/dev/zero bs=100M count=500 | gzip | gzip -d > /dev/null &
代わりに:
('dd if=/dev/zero bs=100M count=500 | gzip | gzip -d > /dev/null &')
括弧はかなり無害で、シェルにサブシェルでパイプを実行させるように指示しますが、一重引用符は問題を引き起こす可能性があります。彼らはパイプ全体を単一の引数として扱うようにシェルに指示し、シェルはそれをコマンド名で実行しようとします。シェルは(おそらく)そのパスでその名前のコマンドを見つけて、次のように指示することは('dd if=/dev/zero bs=100M count=500 | gzip | gzip -d > /dev/null &')
できません。
-bash: dd if=/dev/zero bs=100M count=500 | gzip | gzip -d > /dev/null &: No such file or directory
今、その質問に答えるために
このdd
コマンドは、標準入力または指定されたファイルをif=
標準出力または指定されたファイルにコピーしますof=
。この負荷テストコマンドは入力に使用されます/dev/zero
。/dev/zero
カーネルによって処理される特別な擬似デバイスファイル。ファイルを読み取ると、空の文字の無限のストリームが生成されます。
次に、コマンドの出力dd
(それぞれ100Mずつ500個のチャンク、ヌル文字のみを含む)は、パイプメタ文字を介してコマンドに渡されます。コマンド|
はgzip
データを動的に圧縮し、解凍する他のパイプを通過します。パイプのデータが移動します。パイプの最後のコマンド出力を指定されたファイル(この場合)に書き込むようにシェルに指示するシェルリダイレクト演算子です。これはカーネルが処理する別の特別な疑似デバイスファイルなので、実際には何も記録されず、このファイルへのすべての書き込みは自動的に削除されます。|
gzip -d
>
/dev/null
/dev/null
データをディスクにコピーすると言われました。/dev/null
これは特殊な「ブラックホール」ファイルであり、他のコマンドが標準入力および標準出力から読み書きするため、システムがメモリをディスクに交換しない限り、ディスクには何も書き込まれません。
メタ文字は、&
シェルにバックグラウンドでパイプを実行するように指示します。
答え3
さて、言い換えれば、
dd if(entry device)=/dev/zero(device) (then set)bs=100M(size) (each time)count=500(times) (then send to) | (compressing)gzip (then send to) | (decompressing)gzip -d (redirect process to) > (null device)/dev/null &(don't wait)
今、きれいで詳細な説明は次のとおりです。
dd
は実行中のコマンドまたはプログラムです。
if=
、入力装置
/dev/zero
、デバイスパス(この場合は「/dev/zero」、つまり値が0のデバイス)
bs=
、上記のデバイス/ dev / zeroから取得した生成されたゼロのサイズを指定します。
100M
この場合、/ dev / zeroから100 MBのゼロ(ゼロ)数を取得します。
count=
、何かを満たすためにプロセスが繰り返される回数、またはこの場合の出力
500
、500回、これは100M * 500 = 50000MBと同じです。
|
、出力を次に送信します。この場合はgzipに送信します。
gzip
、gzip形式のファイル圧縮を担当するコマンドまたはプログラムです。 dd コマンドまたはプログラムのデータを圧縮します。
|
、再びgzipコマンドで送信されますが、この場合'gzip-d'
gzip -d
, gzip コマンドまたは実行するプログラム, '-d' は解凍するオプションです
> /dev/null
、gzipプロセスを '/dev/null'にリダイレクトします。
/dev/null
、ゴミや空きスペースのように機能する空のデバイス
&
これは、コマンドが完了するのを待たないことを意味しますが、シェルスクリプト、bash、およびその他のプログラミング言語のデフォルト演算子です。
要約:「dd」プログラムを使用して0(0桁)でいっぱいのファイル(この場合は50000個の0)を作成し、圧縮のためにそれをgzipプログラムに直接送信してからgzipに戻しますが、解凍しています。この例ではもう一度。
50,000個のゼロは、数学および事前設定された測定に応じて、2進数または10進数の形式で変わることがあります。
角かっこがコマンドの一部である場合、i かっこは子操作を表します。例:(サブタスクは次のようになります)、別の例:(コマンド[引数])、しかし通常トリガーするには「$」記号が必要です。これらの角かっこを使用すると、プログラムはシェルスクリプト、bashなどの意味を変更するコードを実行できます。
答え4
他の回答で述べたように、最初のコマンドはデバイスから50Gシンボルを取得し、/dev/zero
STDOUTに送信すると同時にgzip
STDINからストリームを取得し、圧縮してSTDOUTに送信すると同時にgzip -d
STDINから圧縮ストリームを取得します。解凍した出力をdev/null
(ブラックホール)に送ります。すべての背景に入れてください。
ただし、わずかに変更すると、このコマンドはより大きなペイロードを提供できます。ゼロを圧縮するのは簡単なプロセスだからです。 :)
dd if=/dev/random bs=100M count=500 | gzip -9 | gzip -d > /dev/null &
乱数を得ると、圧縮は「より重くなる」。また、圧縮レベルを上げると、コンピュータの負荷も増えます。