Using a laptop with permanent external drives can be a bit annoying when you leave the desk – you have to manually eject all your devices, otherwise you get that dreaded ‘Device Removal’ dialog. With a little bit of Terminal magic, you can automatically eject disks when you sleep the laptop, meaning you can just put the lid down and go. Disk are also reconnected automatically on wake, for when you’re just sleeping the computer without going places.
It’s all thanks to a little utility by Bernhard Baehr called SleepWatcher, which runs in the background and is triggered by sleep and wake events, calling scripts to perform required actions.
Download and install SleepWatcher and its StartupItem. Next, you’re going to create ~/.sleep and ~/.wakeup files which SleepWatcher will call upon. Pull up your favourite text editor and paste the following in (should be just two lines):
#!/bin/sh
osascript -e 'tell application "Finder" to eject (disks where free space ≠ 0)'
Save the file – call it “sleep.txt”, and save it to the Desktop; make sure it’s plain text! Then put the following in another file, called “wakeup.txt”, saved to Desktop too (also just two lines):
#!/bin/sh
/usr/sbin/diskutil list | grep -e ' +[0-9]+: +[^ ]+ [^ ]+' | sed 's/.(disk[0-9].)/\1/' | xargs -I{} /usr/sbin/diskutil mount {}
Next, open the Terminal (Applications, Utilities, Terminal), and type the following:
mv Desktop/sleep.txt .sleep
chmod a+x .sleep
mv Desktop/wakeup.txt .wakeup
chmod a+x .wakeup
Now, whenever you sleep your machine, the external drives will be ejected automatically; when the machine wakes again, all connected external drives will be reconnected.
Great tip on sleep and wake for drives. Will this code work for networked drives (like my NAS, accessed wirelessly)?
Hi, Ethan – Sure, I don’t see why not!
The first script only ejects volumes that are not full (this avoids ejecting optical discs) and can be ejected, but if your remote disk isn’t full I’m not seeing why it would be ejected. For that task you can use the following AppleScript command:
tell application "Finder" to eject (every disk whose ejectable is true or local volume is false)
which I found in the comments at http://vocaro.com/trevor/blog/2007/02/11/a-set-of-scripts-to-unmount-drives-before-sleeping/you dont need to keep the txt files on the desktop do you?
This is a great idea, I’m going to do this!!!
i don’t understand what the grep in the wake file is trying to achieve… either way it returns null on a diskutil list on my system???