はてブロ@ama_ch

https://twitter.com/ama_ch

MacのDropboxクライアントがたまにCPUを消費しまくるっていう

バージョンアップのおかげか、メモリ使用量が問題になることはほとんどなくなったDropboxちゃん。いいぞいいぞ、でもたまにCPUをどか食いするのは何故なの><
ぐぐってみたら、結構同じような症状はあるみたい。mac dropbox cpu - Google 検索

CPU使用率が高いとファンがうるさいし動作全般がもっさりしてしまうので、Dropboxのメモリ消費量があまりにも鬼畜だったので監視して適宜殺すことにしたで書いたシェルスクリプトをちょこっと書き換えてCPU使用率も監視することに。

#!/opt/local/bin/zsh

set -A array $(ps aux -m | grep Dropbox.app | grep -v grep | grep ama-ch)
if [ $(echo $array |wc -w) -eq 0 ]
then    # Dropboxが起動してなかったら通知・起動
    /usr/local/bin/growlnotify -t 'Warning' -m 'DropBox is dead!!' -I /Applications/Dropbox.app
    osascript ~/applescripts/runDropbox.scpt
else    # メモリ消費量が512MBを超えてる or CPU使用率が80%以上ならkill
    if [ $array[6] -gt 512000 -o $(echo "$array[3]>80" | bc) -eq 1 ]
    then
        kill $array[2] && /usr/local/bin/growlnotify -t 'Report' -m 'DropBox was killed.' -I /Applications/Dropbox.app
        osascript ~/applescripts/runDropbox.scpt
    fi
fi

3行目最後のgrep ama-chは、ログインユーザー名に適宜変更します。
7行目のrunDropbox.scptの中身は前回参照。
psコマンドで出力されるCPU使用率は82.6のような小数点以下1桁の小数だから、素直に条件式で

test 82.6 -gt 80 && echo ok

こんな風に比較するとエラーになっちゃう。*1
そこでbcコマンドの比較演算子を使って、

test $(echo "82.6>80" | bc) -eq 1 && echo ok

このように対処した。bcの比較は成立すると1を、しなければ0を返すから、これなら判定できる。
でももっとスマートな方法ありそうな気がする><


そんな訳で、このスクリプトをcronに突っ込んでおけば自動でCPU使用率・メモリ使用量を監視,必要な時に再起動してくれます!

*1:シェルは整数しか扱えないため