コマンドをパイピングすると、すべてのチェーンに適用されますか?

コマンドをパイピングすると、すべてのチェーンに適用されますか?

次の状況を考えてみましょう。

nice -10 mysqldump -u crontab -p'readonly' --databases "$1" | gzip > $hour_folder"/"$1"_h"$hour".sql.gz"

これはnice単に適用可能ですかmysqldumnp、それとも適用可能ですかgzip

答え1

いいえ、niceたとえば、or shellキーワードとは異なり、)はスタンドアロンコマンドなので、パイプで接続されている他のコマンドには適用できません。!time

nice親和性の変更は、後で引数として渡されたコマンドを実行するプロセス(および親和性はフォークから継承されるため、コマンド自体によって生成される可能性があるすべてのプロセス)にのみ適用されます。

これら2つのコマンドの使いやすさを向上させるには、2つの別々の呼び出しが必要ですnice

nice cmd1 | nice cmd2

または、niceパイプを開始するシェルを起動します。

nice sh -c 'cmd1 | cmd2'

reniceあるいは、パイプを開始する前に、現在のシェルまたはサブシェルプロセスのパフォーマンスを向上させることもできます(一部のrenice 実装では置く他人になることの美しさ増加する指定金額に応じて)。

そしてzsh

zmodload zsh/system
(renice 10 $sysparam[pid]; cmd1 | cmd2)

そしてbash

(renice 10 "$BASHPID"; cmd1 | cmd2)

では、zsh非同期的に起動されたコマンドのアフィニティが5だけ増加するため(bgniceオプションが無効になっていない場合)、次のこともできます。

(cmd1 | cmd2 &) &

両方のコマンドの好感度が10増加します。

$ ps -o nice,args | cat
 NI COMMAND
  0 /bin/zsh
  0 ps -o nice,args
  0 cat
$ nice ps -o nice,args | cat
 NI COMMAND
  0 /bin/zsh
 10 ps -o nice,args
  0 cat
$ nice ps -o nice,args | nice cat
 NI COMMAND
  0 /bin/zsh
 10 ps -o nice,args
 10 cat
$ ps -o nice,args | cat &
 NI COMMAND
  0 /bin/zsh
  5 ps -o nice,args
  5 cat
$ (ps -o nice,args | cat &) &
 NI COMMAND
  0 /bin/zsh
 10 ps -o nice,args
 10 cat

さらにnice mysqldump...、この操作に使用されるCPU時間のかなりの量はmysqld要求を処理するプロセスに費やされ、mysqldump実行niceプロセスの状態のみを設定しますmysqldump。これはMySQLサーバープロセスの状態には影響しません。彼ら自身。


!timein やbashKorn などの他の一部のシェルは、コマンドではなくシェル言語のキーワードです。次のパイプに適しています。ただし、後に-p単語がtime続くtime場合、または何らかの方法で引用されている場合は、スタンドアロンtimeコマンドを実行するため、引数として渡されたコマンドを介してのみ機能します。

関連情報