MacOS上でOneDriveが暴走しCPUをブン回し続けてしまう事態がしばしば発生します。
どうやら同じ症状に見舞われている方は多いようで,対策として,たとえば暴走したプロセスをkill
するシェルスクリプトをcrontabに登録する手法が紹介されています。
→ [Mac OS] OneDriveの暴走対策 - Qiita
しかし臆病な私はプロセスを強制終了させるのが怖い。killではなくたとえばCPU使用率の制限でどうにかならないものか。
うってつけの,cpulimit
というコマンドがあるようです。
- GitHub - opsengine/cpulimit: CPU usage limiter for Linux
- Deep Learning や仮想通貨のマイニング時に CPU 使用率が 100% になってしまうのを防ぐ (cpulimit) | まくまくLinux/Shellノート
そこで,暴走を感じたときに手動でcpulimit
を動作させて,頭を冷やしてもらうことにします。
#cpulimit
のインストール
$ brew install cpulimit
$ which cpulimit
/usr/local/bin/cpulimit #←筆者の環境の場合。あとで使う。
#暴走中のプロセスにcpulimit
を適用するAppleScript
なぜAppleScriptにするのかというと,スクリプト・メニューに登録してメニューバーから実行できるようにするためです。
cpulimit
するべきプロセス,私の環境ではプロセス名distnoted
が暴走する場合もあれば,プロセス名OneDrive
が暴走する場合もある。
そこで,何でもいいから一番CPUを使っているプロセスにリミッターをかけることにしました。たぶんkillほど丁寧に考えなくていいし。
set path_cpulimit to "/usr/local/bin/cpulimit" (* 上の$ which で得たパス *)
(* プロセスIDを取得 *)
set pid to (do shell script "ps -Aro pid | sed -n 2p") as number
(* 最大CPU使用率を30%に制限してみる。 *)
do shell script (path_cpulimit & " -l 30 -p " & pid)
このスクリプトをスクリプト・メニューに登録して実行すると,下図のように,ずっとスクリプトが回り続けます⚙。これはおそらくcpulimit
がプロセスを常駐させるコマンドだからで,閉じるボタン(x)をクリックしても反応しません。並列処理の&
オプションをつけても同じでした。
仕方ないので,cpulimitは別のスクリプトから終了させることにします。
#cpulimit
を終了させるAppleScript
do shell script "killall cpulimit"
固定のコマンドを実行するだけですが,AppleScriptにしておくことで,cpulimit発動時と同様にメニューバーから実行できます。
これを実行すると,動き続けていた暴走プロセスcpulimit.scpt
も終了します。おそらく,cpulimit
の終了で処理に戻る結果,最後まで辿り着いて終了するのでしょう。
Enjoy!