Zapewnienie nieprzerwanego działania systemu Mac OSX podczas działania zadania / aplikacji

10

Chcę zostawić rsync pracujący przez Wi-Fi przez wiele godzin przy włączonym zasilaniu prądu przemiennego. Ale kiedy to robię, Mac zrywa połączenie po pewnym czasie.

W okienku Ustawienia energii jest skonfigurowany na „Komputer nigdy nie zasypia”, „Uśpij dysk twardy, jeśli to możliwe” i „Obudź, aby uzyskać dostęp do sieci”.

Plus byłoby dobrze, gdyby Mac rzeczywiście poszedł spać po wykonaniu zadania.

Zdaję sobie sprawę z bardzo podobnego pytania zadawanego wcześniej i że jest pmset i bezsenność X , ale nie chcę, aby maszyna była bezsenna . I nie chcę ciągle instalować coraz większej liczby rozszerzeń, ani nie muszę za każdym razem poprawiać programu pmset.

Chcę, aby natywnie zachowywał się zgodnie z oczekiwaniami - nie zasypiaj, dopóki nie uruchomię zadania, a następnie idź spać „kiedy to możliwe”. Ten czas wynika z rsync, ale następnym razem może być coś innego.

Czy oczekuję zbyt wiele jak zwykle? Czy mogę to naprawić? Czy to w ogóle jest zepsute?

Cregox
źródło

Odpowiedzi:

10

Kofeina

Na przykład:

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

Ze strony podręcznika:

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.

Można go również użyć w sytuacjach takich jak „nie pozwól wyświetlaczowi spać podczas oglądania tego filmu”:

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

... lub „nie śpij przez następne 10 000 sekund”:

caffeinate -t 10000

Zobacz man caffeinateszczegóły.

Nathan Long
źródło
2
To jest niesamowicie niesamowite! Czy to ustawienie domyślne w dowolnym OSX? Od której wersji? (Nie mogłem szybko znaleźć informacji na ten temat)
cregox
@Cawas - zgodnie z tym artykułem zaczęła się wysyłka z Mountain Lion: cnet.com/news/ ... Dowiedziałem się o tym man pmset, gdzie noidleopcja jest wymieniona jako przestarzała.
Nathan Long,
Zobacz także ten fajny samouczek: computers.tutsplus.com/tutorials/...
Nathan Long,
4

Jiggler można ustawić tak, aby „poruszał” myszką tylko podczas jej działania. Zapobiegnie to zasypianiu ekranu i komputera. To nie będzie działać na laptopie z zamkniętą pokrywą. Do tego potrzebujesz InsomniaX lub innej aplikacji opartej na kext.

wprowadź opis zdjęcia tutaj

Josh K.
źródło
Bez przykrywki, w porządku. Nie chcę przegrzać.
cregox
Rzeczywiście przydatna mała aplikacja.
ayaz
Cóż, chociaż nie potrzebuję go ponownie, to faktycznie rozwiązało mój problem i wydaje się, że to miłe rozwiązanie. Chyba powinienem był to zaakceptować wcześniej.
cregox
2

Inną alternatywą jest kofeina . Jest to aplikacja, a nie rozszerzenie, która utrzymuje maszynę w stanie „aktywnym” przez określony czas, po czym maszyna może robić wszystko, co normalnie: wygasać, uruchamiać wygaszacz ekranu, spać itp. Oznacza to, że wygrał ” uśpij urządzenie, ale pozwoli. Wydaje się funkcjonalnie równoznaczne z ustawieniem ustawień oszczędzania energii na „nigdy” w żądanym okresie i przywróceniem ich później.

wprowadź opis zdjęcia tutaj

JRobert
źródło
Ale nadal musisz uruchomić i zatrzymać aplikację. Nie możesz tego ustawić i zapomnieć.
Josh K
1

Możesz rozważyć stworzenie aplikacji Applescript Stay-Open, która ustawia / resetuje licznik czasu uśpienia w zależności od istnienia uruchomionego procesu. Stworzenie uruchomionej listy odtwarzania jest również realnym rozwiązaniem, jednak nadal jestem niepewny co do składni. Polecenie „pmset force sleep X” nie wymaga dostępu do katalogu głównego, ale ustawienia są resetowane po ponownym uruchomieniu.

Ponieważ twoja sytuacja wygląda na to, że nie będę w stanie przewidzieć wszystkich twoich potrzeb, coś naszkicuję.

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

W przypadku takich rzeczy, jak rsync i procesy w tle, musisz być bardziej sprytny i odpytywać inne funkcje, takie jak $ 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

Zauważ, że w powyższym przypadku wyszukiwanie po prostu „rsync” zwróci fałszywie dodatni, jeśli rsyncd jest uruchomiony, ponieważ oba „rsync” i „rsyncd” są zgodne. Być może będziesz musiał się bardziej podstępnie, jeśli to nie zadziała.

Gdyby aplikacja była procesem okienkowym, użyłbym następujących elementów, aby ustalić, co się dzieje:

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

Lub w przypadku identyfikatorów pakietów (bardziej precyzyjnie)

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

Powiedz mi więcej o swoim scenariuszu, a ja postaram się napisać coś dokładniejszego i bardziej elastycznego interfejsu użytkownika.

dotHTM
źródło
mamo, spojrzę na wszystko, co tu powiedziałeś, ale dziękuję, że przeszedłeś wszystkie te kłopoty! Jednak na razie nie zastanawiam się nad pisaniem skryptów. :)
cregox
Dzięki za przywrócenie mojej odpowiedzi do wartości nieujemnej. Żyję dzięki skryptom. Jestem okropny z BASH, ale absolutnie uwielbiam AppleScript i uruchamianie z niego poleceń terminalu.
dotHTM