非常に時間のかかるコマンドなんかを実行した時、「今はちょっとブラウザ見たいから、お前ちょっと黙っててくれない。」なんて気持ちになる時がある。
ちょっと調べたら、その名の通り、cpulimitなるコマンドがあった。ubuntuならパッケージで簡単インストール
使い方は、
* プロセスID指定(50%)
| 
					 1  | 
						$ cpulimit -p 12345 -l 50  | 
					
* 実行ファイル名指定(50%)
| 
					 1  | 
						$ cpulimit -e dd -l 50  | 
					
* PATH指定(50%)
| 
					 1  | 
						$ cpulimit -P /bin/dd -l 50  | 
					
とこんな感じ
ちょっと試したところ
| 
					 1 2 3 4 5 6 7 8 9 10 11  | 
						$ dd if=/dev/urandom of=/dev/null & $ top -b -n 1 |egrep " dd|PID" PID USER      PR  NI  VIRT  RES  SHR S  %CPU %MEM    TIME+  COMMAND 2752 foo   20   0 12432  680  560 R 103.6  0.0   1:37.03 dd $ cpulimit -e dd -l 30 & $ top -b -n 1 |egrep " dd|PID" PID USER      PR  NI  VIRT  RES  SHR S  %CPU %MEM    TIME+  COMMAND 2752 foo   20   0 12432  680  560 T  32.3  0.0   2:20.74 dd  | 
					
とこんな感じ。上はいい感じの部分をとってるが、パーセンテージは結構ばらついていた。
仕組みを解説されているかたがいたのですが、
SIGSTOP
SIGCONT
を繰り返しているだけの模様。実際straceで見てもそんな感じだった。
シグナル送るだけなら、whileループで回せば、sleep時間調整すれば同じようなこと出来るんじゃないかと思ってやってみた。
| 
					 1  | 
						while /bin/true ; do kill -SIGSTOP 2752; sleep 0.0001; kill -SIGCONT 2752; done  | 
					
これで40%近くで安定した。sleep値はモロ環境に依存すると思う。
日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)