残り空きメモリ監視AppleScript「Freemem Monitor」作成

  • 投稿日:
  • by
  • カテゴリ:

<追記>
勝手にRelease Memoryが走る新バージョンFreemem Keeperを作成しました。こちらも合わせてご利用下さい。
空きメモリ確保AppleScript「Freemem Keeper」作った (うむらうす)
</追記>

<また追記>
Snow Leopardに対応しました。
</また追記>

<更に追記>
今ごろLeopard対応しました。ついでにGrowlにも対応させました。('08/8/20)
</更に追記>

<また更に追記('08 Sep)>
アイコンを作っていただきました。 こちらのページのものも、アイコン付きのものに変更しました。
</また更に追記>

以前、解放されていない不使用のメモリを解放することで、 スワップファイルが作られにくくしようというエントリーを書いた。
スワップファイルをなくそう4 (うむらうす)

ここで、解放されていない不使用メモリを解放するAppleScript「Release Memory2」 を作成し、アップしたのだが、これは手動で気付いたときに実行するようにしかなっていなかった。 つまり、空きメモリが減ってきたことを自分で察知して自分で起動する必要があった。 例えば、私の場合は、MenuMetersで空きメモリを視界の端でにらみつつ、 危なくなってきたら上記のRelease Memory2を走らせていた。

しかしうっかり残りメモリが減っているのを見逃してしまうと、 隙をついてスワップファイルが3つ4つ作られてしまったりする。 これではせっかくメモリを解放できるようになっても、意味がない。 目視で観察していてもダメだ。機械に監視させねばならぬ。

ということで、コメントで紹介頂いたMXanadu氏作成のAppleScript「Memory Statistics」をベースに、 残りの空きメモリが少なくなってきたら警告を発し、 ついでにRelease Memory2と連携して起動させるAppleScriptを作ってみようと思った。

で、作った。(協力:MXanadu氏)

Tiger用
ダウンロード:Freemem_Monitor.zip

Leopard用ダウンロード:
FreememMonitor_wakaba_Small.pngwakabaさんアイコンver
Freemem_Set_for_Leopard(wakaba).zip
Edm2_White_Large.pngEdm2さんアイコンver
Freemem_Monitor_for_Leopard(Edm2).zip

zipファイルを解凍すると、「Freemem Monitor」とか他のものも入っているので、好きなものをどうぞ。(Growl)と付いているものはGrowlで通知するもの、ついていないものはDialogで通知するもの。
<追記>
複数置いてあるが、アイコンが違うだけで、効果は同じ。 お好きなものをお使いください。
</追記>

使い方:
1.Freemem Monitorを起動
2.空きメモリが何MB以下になったら警告するかを設定
3.あとは放っておく。Freemem Monitorは1分置きに空きメモリをチェックし、 設定容量以下になったら以下のようなプロンプトを表示する

プロンプト画面
選択肢「Run!」「No」「Quit」はそれぞれ、Release Memoryを呼び出す(監視も続行)、 呼び出さない(監視は続行)、監視をやめFreemem Monitorを終了する、という動作。

まだRelease Memor終了後にエラーが出たりと完成していないが、 とりあえずさらしてみる。 コメント等大歓迎。

ソースは以下の通り。MXanaduさんありがとうございます。

set temp_delim to AppleScript's text item delimiters

--Free memoryリミット値(MB)の設定
--propertyでなくても、ハンドラ内でglobal宣言すればOK

set alarm_size to text returned of (display dialog "Input the limit memory size(MB)." default answer "200")
--リミット値をページ単位に換算 (1024^2)/4096=256
set alarm_pages to alarm_size * 256

--監視間隔(秒)の設定
property waiting_interval : "60"


on idle

--Mach Virtual Memory Statistics(vm_stat)から空きメモリページ数を取得
global alarm_pages, alarm_size

set AppleScript's text item delimiters to return
set vm_stats to do shell script "vm_stat | grep Page"
set free_mem to text item 1 of vm_stats

set AppleScript's text item delimiters to " "
set free_size to (last text item of free_mem) as number


-- Main part of the script.
-- When Free memory is less than set number,
-- run Release Memory script to prevent memory shortage.
if free_size is less than alarm_pages then

-- Run Release Memory
display dialog "Release Memory started" buttons {"OK"}

-- Restart Finder
tell application "Finder"
quit
delay 1

try
tell application "Finder" to activate
on error
delay 1
tell application "Finder" to activate
end try


if exists Finder window 1 then
activate
set windowBounds to (bounds of Finder window 1)
set theFolder to target of Finder window 1
close Finder window 1
open theFolder
set bounds of Finder window 1 to windowBounds
end if

end tell

--on activateFinder()
-- try
-- tell application "Finder" to activate
-- on error
-- activateFinder() of me
-- end try
-- end of activateFinder()

-- end of restart Finder


-- restart Dock
do shell script "killall Dock"


--delete Dashboard cache
do shell script "rm -rf ~/Library/Caches/DashboardClient/*"



--do shell script "diskutil repairPermissions /"

--End of Release Memory
display dialog "Release Memory finished" buttons {"OK"}


end if

return waiting_interval

end idle

set AppleScript's text item delimiters to temp_delim

何分おきというように周期的に動かすには、スクリプト保存時に設定が必要。
保存画面
「実行後、自動的に終了しない」をチェックするのがポイント。


まとめ

  • 目視で空きメモリをチェックしていると、うっかり見逃しがちなので、プログラムに監視させることにした。
  • そのプログラムからRelease Memoryを起動できるようにした。
  • まだエラーが出るのでいつか直す。
  • Growlと連携とかできそうなので、気が向いたらするかも

<追記>
スクリプトを紹介して頂いた。まいどどうもです。m(_*_)m
muta's mac scribbling - OS運用記録9月4