OSX Lion login/logout script

Mivel SSD van az MBP-mban, felmerült az igény, hogy legyen a böngésző cache a ram-ban, mert abból van bőven. Készítünk egy RAM disk-et, majd átpakoljuk/linkeljük oda a megfelelő dolgokat.

Azt sem szeretnénk, hogy az asztalon figyeljen egy volume icon, tehát azt elrejtjük. Firefox és Safari is kell, íme a script:

file: Scripts/firefox-cache-ramdisk.sh


#!/bin/bash

ScriptUser=majki
VolumeName=FFCache

# if script is running as root, switch to user
if [ "$(/usr/bin/whoami)" == "root" ]; then
	echo "We are running as root, switching to user $ScriptUser"
	/usr/bin/su - $ScriptUser -c "$0 $1"
	exit 0
fi

if [ "$1" == "start" ]; then

	cd ~/Library/Caches/Firefox/

	if test -d Profiles_; then
		echo "Unclean shutdown detected, fixing..."
		/bin/rm Profiles
		/bin/mv Profiles_ Profiles
	fi
	# ^- szerkesztve

	SizeInMB=512
	NumSectors=$((2*1024*SizeInMB))
	DeviceName=`/usr/bin/hdid -nomount ram://$NumSectors`
	echo $DeviceName
	/usr/sbin/diskutil eraseVolume HFS+ $VolumeName $DeviceName

	# hiding volume
	/Developer/Tools/SetFile -a V /Volumes/$VolumeName
	/usr/bin/killall Finder

	/bin/mv Profiles Profiles_ &&
	/bin/ln -s /Volumes/$VolumeName ./Profiles &&
	/opt/local/bin/gcp -a Profiles_/* Profiles 

	# Creating safari stuffs

	/bin/mkdir -p /Volumes/$VolumeName/Safari/com.apple.Safari
	/bin/mkdir -p /Volumes/$VolumeName/Safari/Metadata/Safari

elif [ "$1" == "stop" ]; then

	cd ~/Library/Caches/Firefox/
	/opt/local/bin/rsync -av --delete Profiles/ Profiles_/
	# ^- szerkesztve, a 2 paraméter rossz sorrendben volt (hrgy84,Elbandi)
	/sbin/umount /Volumes/$VolumeName
	/bin/rm Profiles
	/bin/mv Profiles_ Profiles 

else
	echo "Usage: $0 [start|stop]"
	exit 1
fi

exit 0

Mivel mostanában többször előfordult, hogy újra kellett indítani a gépet és nyilván elfelejtettem elindítani ezt a script-et, felmerült az ötlet, hogy induljon el magától, és kikapcsoláskor, vagy kijelentkezéskor csinálja is vissza a dolgokat, ahogy kell :) Ímeg a login/logout scriptek:

file: Scripts/loginhook.sh


#!/bin/bash

LOGINHOOKLOG=/var/log/loginhook.log
echo "** LoginHook starting at $(/bin/date '+%Y-%m-%d %H:%M:%S') ..." >> $LOGINHOOKLOG
/Users/majki/Scripts/firefox-cache-ramdisk.sh start >> $LOGINHOOKLOG
echo "** LoginHook finished at $(/bin/date '+%Y-%m-%d %H:%M:%S')" >> $LOGINHOOKLOG

file: Scripts/logouthook.sh


#!/bin/bash

LOGOUTHOOKLOG=/var/log/logouthook.log
echo "** LogoutHook starting at $(/bin/date '+%Y-%m-%d %H:%M:%S') ..." >> $LOGOUTHOOKLOG
/Users/majki/Scripts/firefox-cache-ramdisk.sh stop >> $LOGOUTHOOKLOG
echo "** LogoutHook finished at $(/bin/date '+%Y-%m-%d %H:%M:%S')" >> $LOGOUTHOOKLOG

A végére pedig jöjjön a lényegi rész, hogyan oldjuk meg, hogy ezek a scriptek elinduljanak a megfelelő esetekben. Ennyire egyszerű:


sudo defaults write com.apple.loginwindow LoginHook /Users/majki/Scripts/loginhook.sh
sudo defaults write com.apple.loginwindow LogoutHook /Users/majki/Scripts/logouthook.sh

Hozzászólások

Köszi.

-1 napos (holnaptól) Mac Mini tulajdonosként segítségedet kérném, hogy ilyen szintű infók az OSX-ről hol szerezhetőek be?
--
Sent from my hand

Szerintem célszeű így ellenőrizni:

[ x"$1" = x'start' ]

Nem az = vs. ==-re gondolok, bash-ben mindegy, hanem az x-re. Ha jól sejtem, a mostani ellenőrzésed hibát fog adni, ha paraméterül speciélis karaktereket, pl. (, ), [, ] használsz. Illetve próbálgatom, nem is itt számít, hanem egyéb konstrukciókban:

a='('; [ "$a" = "start" -a -d /bin ]; echo $?
bash: [: `)' expected, found start

Ugyanakkor:

a='('; [ x"$a" = x"start" -a -d /bin ]; echo $?
1

Az a lényeg, hogy a helyettesített zárójelet simán operátornak nézi, ha jól látom.

tr [:lower:] [:upper:] <<<locsemege
LOCSEMEGE

Azért használok egy szögletes zárójelet, s nem kettőt, mert az utóbbi bash-only megoldás. Annyiban viszont hülyeség a részemről, hogy máshol viszont kihasználom a bash feature-eit, nem írok hordozható scripteket, akkor meg ugye mindegy. :)

tr [:lower:] [:upper:] <<<locsemege
LOCSEMEGE

/opt/local/bin/rsync -av --delete Profiles_/ Profiles/

Ezt nem forditva akartad irni? Ha jol ertem, a Profiles egy link a ramdiskre, a Profiles_ az meg... ooo... ? Mintha a stopnal nem is nagyon lenne krealva ilyen. Valami ott a stop kornyeken logikailag nekem nem jon ossze.
--

Ki oda vagyik, hol szall a galamb, elszalasztja a kincset itt alant. | Gentoo Portal 

ez mondjuk nekem sem vilagos :(
rasynceled a Profile_ tartalmat a ramdiskes cuccra (Profile), utana meg torlod?

Masik, azt megnezted hogy a start akkor is jol mukodik ha nemvolt elotte szabalyos stop (elment a meku/lefagyott/kibokted/akarmi)?

--
A vegtelen ciklus is vegeter egyszer, csak kelloen eros hardver kell hozza!

Aha, tényleg, igazatok van :) A két paramétert meg kell cserélni. Azt nem teszteltem, hogy mi van ha úgy indítom, hogy nem állt vissza rendesen, de javítottam a script-et úgy, hogy észreveszi, ha nem volt normális leállás, és legalább a könyvtárakat rendberakja.
--
HUPbeszolas FF extension

Ha sűrűn hozzányúl a FF a disk-en lévő cache-éhez, az amúgy is bekerül a RAM cache-be, nem? Persze onnét kikerülhet abban az esetben, ha több adatot olvas fel a rendszer közben mint a szabad RAM - de ha nem, akkor elvileg úgyis benne lesz a RAM-ban - a disk-re kiírni meg ráér a háttérben a rendszer. Persze ez akkor működhet, ha hosszabb használat után a szabad memóriából a cache-t is levéve még mindig van szabad mem.

Mondjuk nálam 1 GB a disk-en lévő Chrome-hoz tartozó cache, de ha megnyitom pl. az index.hu-t és közben nézem a disk terhelést, akkor első megnyitáskor látszik hogy sok I/O van, de többszöri megnyitásra közel nulla.

Tehát ez amit csinálsz, nem éppen a rendszer által amúgy is végzett cache-elés megkerülésének rossz módja? Mert ha nálad is 1 GB körül van a FF cache - ami csak hízni fog idővel - akkor használattól függetlenül feleslegesen foglalja a fizikai memóriát - ha meg amúgy is sok RAM van a gépedben, akkor a rendszer cache-nek is lesz elég hely - és legalább mindig az lesz a cache-ben ami a legsűrűbben felolvasásra kerül (tudom komplex ez az algoritmus, de a lényeg ez).

Kieg.: Ha meg boot után manuálisan be akarod tolni a cache-be a FF cache-t, talán elég lenne egy (find | xargs cat) >/dev/null vagy hasonló szerintem.

Ha az SSD írástól való kímélése a cél, akkor érthető, mert amúgy írogat folyamatosan FF és Chrome is. Ha tmpfs-re átteszem a .mozilla mappát és vissza linkelem, akkor nulla az írások száma böngészés közben.

Viszont akkor éppen ezért a FF cache-t nem tenném a RAM-ba a fentiek miatt amit írtam. Mert azt így is úgy is vissza akarod (fixme) írni a disk-re - ha másnem logout-kor. És itt két eset lehet:

1) keletkezik új FF cache adat - ezt akkor már lehet hogy mindegy lenne, ha azonnal kiírod disk-re (hiba esetén azért mégis a RAM-ból veszik el az adat)
2) ha nem keletkezik új cache adat, akkor meg úgyis bent lesz a rendszer cache-ben a memóriában

Ezért szerintem elég lenne a profil-ból a Cache kivételével a többit tmpfs-re tenni. A profil úgysem foglal sok helyet szemben a Cache mappával. Ezt ki is próbáltam: a ~/.mozilla mappát átmozgattam a Linux-omon /dev/shm/ -be ami tmpfs, ebből a mappából a Cache-t meg visszamozgattam a disk-re, a helyére meg vissza symlink-eltem - és előzőleg már megtekintett lapok betöltésekor nincs sem írás, sem pedig olvasás a FF folyamat részéről.

Ezen a megjegyzéseden meglepődtem. A hozzászólásoktól, észrevételektől a blogod nem lesz értéktelenebb, ugyanolyan kék marad bárki számára. :) Meg aztán többnyire nem felkérésre szólunk hozzá a különféle témákhoz, hanem azért, mert valami eszünkbe jut róla.

tr [:lower:] [:upper:] <<<locsemege
LOCSEMEGE

Ezt nem feltételezte senki. Viszont azt áruld el - nagyon off -, hogy bizonyos esetekben a HUPbeszólás a következő, előző új hozzászólás nyilacskáira kattintva miért nem csinál semmit? Van, amikor nem ugrik oda. Netán +1-es hozzászólásra mutat, azt elrejted, s nem lesz hivatkozás?

Most már on. :)

tr [:lower:] [:upper:] <<<locsemege
LOCSEMEGE

Pontosan :) Ha +1 van, vagy hasonló elrejtett, akkor nem tud oda ugorni. Akkor a menüben vissza lehet kapcsolni, hogy mutassa meg az elrejtett hozzászólásokat, onnantól működik :) Mellesleg működik Safari-n is, én azon használom már hetek óta. Lehet hogy az is kikerül public-ba.
--
HUPbeszolas FF extension