ShellScript
launchd
plist
Clipy

Mac上で暴走するClipyを鎮める

クリップボードを拡張する「Clipy」は重宝しているのですが、たまに暴走していてmacが轟音をあげることがしばしば…
というわけで、ClipyのCPU使用率とメモリ使用量を監視して、Clipyが暴走したら自動でアプリを再起動させます。

参考

手順

1.「terminal-notifier」をインストール
Clipyの暴走を知らせるために後々使います

$ brew install terminal-notifier

2.Clipy起動スクリプト作成

~/Documents/applescripts/runClipy.scpt
tell application "Clipy" to run

3.監視用shellスクリプト作成
※9行目のCPU使用率とメモリ使用量は適宜変更

~/Library/LaunchAgents/watchclipy.sh
#!/usr/local/bin/zsh

set -A array $(ps aux -m | grep Clipy | grep -v grep | grep $USER)
if [ $(echo $array |wc -w) -eq 0 ]
then    # Clipyが起動してなかったら通知・起動
    terminal-notifier -message 'Clipy is dead!!'
    osascript ~/Documents/applescripts/runClipy.scpt
else    # メモリ消費量が128MBを超えてる or CPU使用率が10%以上ならkill
    if [ $array[6] -gt 128000 -o $(echo "$array[3]>10" | bc) -eq 1 ]
    then
        kill $array[2] && terminal-notifier -message 'Clipy was killed.'
        osascript ~/Documents/applescripts/runClipy.scpt
    fi
fi

4.LaunchAgents用のplistを作成
※下記の場合、60秒毎にshellが動きます

~/Library/LaunchAgents/watch.clipy.agent.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>watch.clipy.agent</string>
    <key>ProgramArguments</key>
    <array>
        <string>/Users/akimats/Documents/sh/watchclipy.sh</string>
    </array>
    <key>StandardErrorPath</key>
    <string>/dev/null</string>
    <key>StandardOutPath</key>
    <string>/dev/null</string>
    <key>StartInterval</key>
    <integer>60</integer>
</dict>
</plist>

5.Launchdへ登録

$ launchctl load ~/Library/LaunchAgents/watch.clipy.agent.plist

6.Launchdへ登録されているか確認

$ launchctl list | grep watch.clipy.agent

結果

Clipy was killed!!!!!
スクリーンショット 2017-12-27 12.47.03.png
※ちゃんと生き返らせてます。メッセージは適宜変更して下さい。