2015年2月13日金曜日

謎のコマンドyesの使い方(Linux標準コマンドでCPU・メモリに負荷を掛ける方法)

Linuxには"yes"というコマンドがある。最初何だそれは、と思ったコマンドだが、案外使い道の多いコマンドだったので、まとめてみた。

基本編

「"y"を一文字入力して改行するを無限に繰り返す」が基本動作となる。
# yes
y
y
y
y
y
~以下略~
y
y
^C   ←Ctrl + Cで止める
#
yesの後に文字列を書けば、その文字列が繰り返される。
# yes no
no
no
no
no
no
~以下略~
no
no
^C   ←Ctrl + Cで止める
#
このコマンドの意図される使い方は、rmコマンド等でyes/noを求められる際にyesをパイプで渡してやると、いちいち"y"を押してエンターする手間が省けるという使い方ができることらしい。rmでは-fオプションあるから、よほど変わった人では無い限り常用はしないだろうが、-fオプションの無いコマンドでは使い道はあるかもしれない。
# yes | rm testfile.txt
rm: remove 通常ファイル `testfile.txt'?    ←間髪入れずにyが入力される
#

応用編

このコマンドの真髄は、アイデアによって面白い使い方ができることだと思う。特にサーバーへ負荷を掛けるにはうってつけである。

CPUに負荷を掛けるyes

# yes > /dev/null
※CPU負荷が高くなる原理:/dev/nullに"y"を無限に出力する。この処理がCPUを使い切る程の速度で実行されるため(画面描写が無いので超高速)

メモリに負荷を掛けるyes

# /dev/null < `yes`
または
# /dev/null < $(yes)
※メモリ負荷が高くなる原理:/dev/nullに`yes`(=$(yes))を入力する。無限に続くyが入力されることによって、メモリを沢山使ってくれるらしい(理解不足)

ちなみに、この処理は徐々にメモリ使用量が上がっていく動作をするので、早く上げたい場合は、yesの後に文字列を付与すると多少早くなるようだ。
# /dev/null < `yes aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa`

参考URL

UNIXシェルスクリプトメモ
http://www.ne.jp/asahi/hishidama/home/tech/unix/sh.html