Как автоматически извлечь внешние диски перед отходом Мака ко сну

Совершенно не готов был столкнуться с такой проблемой, но вот она. Принес ноутбук, подключил питание, монитор, USB шнурок. В мониторе хаб, к нему подключена клавиатура и внешний диск. Солнце село, отправил макбук в сон, отключил монитор, питание и выдернул шнурок USB…

Проблема первая — ноут просыпается при отключении USB. Внешний монитор не включает, но «сонно дышащий» индикатор делает вдох и с минуту снова светитится постоянно.

Проблема вторая — при следующем включении вас ждет уведомление — диск извлечен неправильно.

Диск извлечен неправильно

С одной стороны, компьютер мог уснуть ненадолго, либо никто его никуда нести не собирался, короче, отключать провода не планировалось.

С другой стороны, спящий ноут — то же выключенный (я свой не помню когда выключал по-настоящему). Не надо бы ему просыпаться при отключении проводов, ой не надо. Ну и ругаться затем на неверно извлеченный диск тоже.

Самое разумное решение — отключать внешние диски при засыпании, подключать при пробуждении. Автоматически. Незаметно. Но Маки этого не умеют. Хуже того, Automator нельзя научить выполнять эти фокусы — нет триггеров onsleep/onwake.

Решения, которые я рассматривал и что в итоге выбрал.

Jettison (AppStore, 66 рублей)

Jettison automatically ejects external disks from your Mac before your computer goes to sleep and remounts them when it wakes.

Jettison

Извлекет внешние диски из вашего Мака перед тем, как ваш компьютер засыпает и подключает их при пробуждении. Именно то, что требуется. Есть нюанс — в отзывах пишут: HDD не подключается после сна. Полагаю, речь о ситуации, когда диск на время сна физически не отключали. Второе наблюдение — в AppStore предлагается версия 1.2.4 от октября 2012, а на сайте разработчика доступна версия Jettison 1.3, уже за $4.95. Обновить AppStore версию до 1.3 можно, скачав новую с сайта разработчика. Отчего так сложно — не понять.

autoEJECT (99 руб, AppStore)

Похожее описание, те же функции, та же неясность с версией — сделано в 2012 году, требуется OS X 10.6 или более поздняя версия. Для этого приложения даже сайта нет, ссылка ведет на почтовый ящик разработчика.

Оба приложения, при условии их работоспособности, выглядят излишне жирным решением для простой задачи. Мне ни к чему эти иконки в строке системного меню, настройки, выпадушки…

SleepWatcher, бесплатно

Это daemon AKA «демон», процесс, который мониторит сон/пробуждение/простой/бодрствование компьютера и позволяет выполнять разные штуки при возникновении этих событий.

Заряжаем Терминал (у меня iTerm2) и вперед.

comp:~ user$ cd ~
comp:~ user$ curl http://www.bernhard-baehr.de/sleepwatcher_2.2.tgz >sw.tgz
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 43385  100 43385    0     0  20017      0  0:00:02  0:00:02 --:--:-- 20020
comp:~ user$ tar -xzf sw.tgz
comp:~ user$ cd sleepwatcher_2.2/
comp:sleepwatcher_2.2 user$ ls
ReadMe.rtf	config		sleepwatcher	sleepwatcher.8	sources
comp:sleepwatcher_2.2 user$ sudo mkdir -p /usr/local/sbin /usr/local/share/man/man8
Password:
comp:sleepwatcher_2.2 user$ sudo cp ~/sleepwatcher_2.2/sleepwatcher /usr/local/sbin
comp:sleepwatcher_2.2 user$ sudo cp ~/sleepwatcher_2.2/sleepwatcher.8 /usr/local/share/man/man8
comp:sleepwatcher_2.2 user$ sudo mv ~/sleepwatcher_2.2/config/de.bernhard-baehr.sleepwatcher-20compatibility-localuser.plist ~/Library/LaunchAgents/de.bernhard-baehr.sleepwatcher.plist
comp:sleepwatcher_2.2 user$ sudo chown root ~/Library/LaunchAgents/de.bernhard-baehr.sleepwatcher.plist
comp:sleepwatcher_2.2 user$ sudo chmod 644 ~/Library/LaunchAgents/de.bernhard-baehr.sleepwatcher.plist
comp:sleepwatcher_2.2 user$ sudo launchctl load ~/Library/LaunchAgents/de.bernhard-baehr.sleepwatcher.plist
comp:sleepwatcher_2.2 user$ nano ~/.sleep
comp:sleepwatcher_2.2 user$ nano ~/.wakeup
comp:sleepwatcher_2.2 user$ chmod a+x ~/.sleep ~/.wakeup
comp:sleepwatcher_2.2 user$

Содержимое скриптов, которые и выполняют всю работу

comp:sleepwatcher_2.2 user$ cat ~/.sleep
#!/bin/sh
/usr/sbin/diskutil list | grep -e 'disk[1-9]s.*' | sed 's/.*\(disk[0-9].*\)/\1/' | xargs -I{} /usr/sbin/diskutil eject {}
comp:sleepwatcher_2.2 user$ cat ~/.wakeup
#!/bin/sh
sleep 5
/usr/sbin/diskutil list | grep -e 'disk[1-9]s.*' | sed 's/.*\(disk[0-9].*\)/\1/' | xargs -I{} /usr/sbin/diskutil mount {}

Если у вас 2 внутренних диска, как в моем случае, нужно в каждом файле поменять disk[1-9] на disk[2-9], поскольку внутренние накопители извлекать и подключать насильно ни к чему.

Проверил, работает. Первая строчка — Мак засыпает, вторая — просыпается.

Feb 27 17:59:55 comp kernel[0]: hfs: unmount initiated on MeinAusweis on device disk2s1
Feb 27 18:01:43 comp kernel[0]: hfs: mounted MeinAusweis on device disk2s1

Иная ситуация, немного иные задачи, те же методы и гораздо более подробное изложение — Automatically eject external disks on sleep and reconnect after on OS X.

Добавить комментарий