Поддержание Mac OSX и бессонница во время выполнения задачи / приложения


10

Я хочу, чтобы rsync работал по Wi-Fi в течение нескольких часов при включенном питании переменного тока. Но когда я это делаю, Mac через некоторое время разрывает соединение.

На панели настроек энергопотребления настроено «Компьютер никогда не спит», «Переведите жесткий диск в спящий режим, когда это возможно» и «Пробуждение для доступа к сети».

Кроме того, было бы хорошо, если бы Mac на самом деле ложился спать, как только задача была выполнена.

Я понимаю , что очень похожий вопрос был задан до и что есть pmset и insomniaX , но я не хочу, чтобы машина будет бессонной . И я не хочу продолжать устанавливать все больше и больше расширений, и мне не нужно каждый раз настраивать pmset.

Я хочу, чтобы он вел себя как положено - бодрствуйте, пока я оставляю выполнение задачи, а затем засыпаем «когда это возможно». На этот раз из-за rsync, но в следующий раз может быть что-то еще.

Я ожидаю слишком многого, как обычно? Могу ли я это исправить? Это даже сломано?

Ответы:


10

Caffeinate

Например:

caffeinate -i rsync -avz someuser@somehost:somefolder /some/local/folder

Со страницы руководства:

EXAMPLE
     caffeinate -i make
        caffeinate forks a process, execs "make" in it, and holds an
        assertion that prevents idle sleep as long as that process
        is running.

Его также можно использовать в ситуациях, таких как «не позволяйте дисплею спать, пока я смотрю этот фильм»:

caffeinate -d # in effect until you hit Ctrl+C

... или "не спите в течение следующих 10000 секунд":

caffeinate -t 10000

Смотрите man caffeinateподробности.


2
Это безумно круто! Это по умолчанию на любом OSX? С какой версии? (Я не мог быстро найти информацию об этом)
cregox

@Cawas - согласно этой статье, он начал поставляться вместе с Mountain Lion: cnet.com/news/… Я узнал об этом из того места man pmset, где noidleопция указана как устаревшая.
Натан Лонг

Кроме того , увидеть это хороший учебник: computers.tutsplus.com/tutorials/...
Nathan Long

4

Jiggler может быть настроен так, чтобы только «покачивать» мышь, когда она работает. Это предотвратит спящий экран и компьютер. Это не будет работать на ноутбуке с закрытой крышкой. Для этого вам понадобится InsomniaX или другое приложение на основе kext.

введите описание изображения здесь


Крышка не закрыта, это нормально. Я не хочу перегреваться.
cregox

Действительно, удобное небольшое приложение.
ayaz

Ну, хотя мне это больше не нужно, это фактически решило мою проблему, и это кажется хорошим решением. Я думаю, я должен был принять это раньше.
Cregox

2

Другой альтернативой является кофеин . Это приложение, а не расширение, которое сохраняет машину «активной» в течение определенного периода времени, после чего машина может делать все, что обычно делает: гаснет, запускает заставку, спит и т. Д. Не усыпляйте свою машину, но позволите. Это кажется функционально эквивалентным установке настроек энергосбережения на «никогда» в течение запрашиваемого периода и их восстановлению после этого.

введите описание изображения здесь


Но вы все равно должны запустить и остановить приложение. Вы не можете установить это и забыть.
Джош К

1

Вы можете рассмотреть возможность создания приложения Applescript с открытым исходным кодом, которое устанавливает / сбрасывает таймер отключения в зависимости от наличия запущенного процесса. Создание launchd plist также является жизнеспособным решением, однако я все еще сомневаюсь в синтаксисе. Команда «pmset force sleep X» не требует root-доступа, но настройки сбрасываются при перезагрузке.

Поскольку ваша ситуация звучит так, будто я не смогу предугадать все ваши потребности, я напишу что-то для вас.

property LoopTime: 5 --measured in seconds
property normalSleepTimeout: 30 --measured in minutes
property processName: "rsync"  --the name of the process you're trying to find

on run
   do shell script "pmset force sleep 0"  --disables sleep
   idle()
end

on idle
   if not appIsRunning() then 
      do shell script ("pmset force sleep " & normalSleepTimeout as string) -- sets sleep to desired idle timeout
      quit
   end
   return 
end

on appIsRunning()
   --Here's where you need to do the test that an app is running.  True needs to mean "the app is running".  Store the value to "result" or change the below return statement.

   return result
end

Для таких вещей, как rsync и фоновые процессы, вам нужно стать более умным и опрашивать другие функции, такие как $ top.

set result to False
if 0 < (count of (do shell script ("top -l 1 | grep" & processName as string))) then
   set result to True
end

Обратите внимание, что в вышеприведенном случае поиск только «rsync» вернет ложное срабатывание, если rsyncd работает, потому что оба «rsync» и «rsyncd» совпадают. Возможно, вам придется стать более хитрым, если это не работает для вас.

Если бы приложение было оконным процессом, я бы использовал следующее, чтобы определить, что работает:

tell application "System Events" to set RunningAppNames to name of processes

Или для идентификаторов пакета (точнее)

tell application "System Events" to set RunningBundles to bundle identifier of processes

Расскажите мне больше о вашем сценарии, и я постараюсь написать что-то более точное и с более гибким пользовательским интерфейсом.


Дам, я посмотрю все, что ты сказал здесь в другой раз, но спасибо, что прошел через все эти неприятности! Хотя сейчас я не собираюсь писать сценарии. :)
cregox

Спасибо за доведение моего ответа до неотрицательного значения. Я живу по сценариям. Я ужасен с BASH, но я очень люблю AppleScript и запуск команд терминала из него.
dotHTM
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.