Jak mogę wymusić wyłączenie komputera Mac w wyznaczonym czasie?

19

Szukam aplikacji do automatycznego wyłączania, która wymusi wyłączenie komputera w wyznaczonym czasie.

Najważniejszą częścią tego jest to, że zamknięcie nie powinno być anulowane (chyba że proces jest bardzo uciążliwy).

Złupić
źródło
Co rozumiesz przez „aplikację”? Czy musi to być program GUI, czy uruchomienie (które sugeruję poniżej) jest dopuszczalne? Jeśli robisz to, co aplikacja GUI, co chcesz zrobić? Pytaj o czas, w którym komputer powinien zostać wyłączony po uruchomieniu?
TJ Luoma,

Odpowiedzi:

25

Ok, więc w nawiązaniu do mojej poprzedniej odpowiedzi mogę przeprowadzić użytkownika przez crona (wbudowaną usługę harmonogramu UNIX) do uruchomienia zaplanowanego polecenia zamknięcia.

Będzie działał jako root i zostanie wymuszony.

  • Otwórz terminal (/ Aplikacje / Narzędzia / Terminal)
  • Wejście sudo crontab -e

Musisz wprowadzić hasło logowania, a następnie nacisnąć enter.

Będziesz teraz w edytorze tekstu (vim). Ostrożnie wprowadź następujące naciśnięcia klawiszy.

  • Naciśnij iraz (pozwoli to wprowadzić tekst)

Powiedzmy, że chcesz, aby maszyna była zamykana codziennie o 2 w nocy, teraz wprowadzimy:

* 2 * * * /sbin/shutdown -h now

Jeśli chcesz, aby maszyna była zamykana codziennie o 2:30, wpisz:

30 2 * * * /sbin/shutdown -h now
  • Po wpisaniu tego naciśnij esc
  • Następnie naciśnij shift+ z shift+z (to dwa razy wielkie „Z”, aby zapisać zmiany i wyjść z edytora)

Powinieneś teraz wrócić do wiersza poleceń, w którym zacząłeś.

Jesteś skończony!

macaco
źródło
Nie musisz sudotam stawiać ? Wiem, że prawdopodobnie spowoduje to zawieszenie się, ale jestem prawie pewien, że musisz być rootem, aby uruchomić shutdown.
daviesgeek
Żadne wyjątki nie są potrzebne, to niesamowita odpowiedź, dość radośnie zaskoczona, szczególnie po tym, jak odpowiedziałem ci niegrzecznie. Bardzo dziękuję za pomoc
Harry,
3
@daveisgeek - Masz całkowitą rację, ale pamiętaj, że uruchamiamy crontab z sudo. Oznacza to, że edytujemy plik crontab użytkownika root, a zatem wszelkie zaplanowane polecenia będą wykonywane jako ten użytkownik.
macaco
Hej, zrobiłem to iw wyznaczonym czasie dostałem okno dialogowe z informacją, że ten komputer wyłączy się za 10 minut? I prosi mnie o anulowanie. Nie wiem, czy to wynik cronu, czy też oszczędzania energii. Czy cron powinien wymusić zamknięcie bez okna anulowania?
Harry
3
shutdownjest w /sbinktórym prawdopodobnie nie ma domyślnej $ PATH cron. Aby to naprawić, zrób to sudo crontab -ejeszcze raz, wpisz, ddaby usunąć linię (zakładając, że plik wygląda jak ten, który podłączyłeś powyżej) i ponownie wprowadź linię jako 30 22 * * * /sbin/shutdown -h now.
nohillside
13

Można to jednak anulować:


Zatrzymaj się na yymmddhhmm:

shutdown -h 1109211555

Zatrzymaj się za 4 minuty:

shutdown -h +4

/Library/LaunchAgents/me.lri.forceshutdown.plist:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>me.lri.forceshutdown</string>
    <key>ProgramArguments</key>
    <array>
        <string>shutdown</string>
        <string>-h</string>
        <string>now</string>

    </array>
    <key>StartCalendarInterval</key>
    <dict>
        <key>Hour</key>
        <integer>23</integer>
        <key>Minute</key>
        <integer>0</integer>
    </dict>
</dict>
</plist>

Jeśli plist był własnością zwykłego użytkownika, próba załadowania go spowodowałaby błąd launchctl: Dubious ownership on file (skipping):

sudo chown root /Library/LaunchAgents/me.lri.forceshutdown.plist

Agenta można załadować, wylogowując się i ponownie logując, lub za pomocą:

sudo launchctl load /Library/LaunchAgents/me.lri.forceshutdown.plist

sudo crontab -e

`08 16 * * * /sbin/shutdown -h now`

Spowoduje to normalne niewymuszone zamknięcie:

osascript -e 'tell app "System Events" to shut down'
Lri
źródło
Podczas dodawania polecenia shutdown do uruchomionego agenta w / Library / LaunchAgents /, to nie działało, a „konsola” rejestrowała „zamknięcie: NIE superużytkownik”. Być może zadziałałoby to w / System / Library / LaunchAgents (ale nie należy tam umieszczać rzeczy :-)) Potrzebowałem tylko normalnego wyłączenia, więc poszedłem z osascript i umieściłem to w ~ / Library / LaunchAgents /bla.shutdown.plist. Działało dobrze.
commonpike
Musiałem jednak użyć <code> osascript -e 'powiedz aplikacji „Finder”, żeby się zamknął ”</code>
commonpike
To jedyna poprawna odpowiedź. (moim zdaniem)
CousinCocaine,
9

Można to zaplanować w Preferencjach systemowych> Oszczędzanie energii> Harmonogram . Nie jestem pewien, czy to zainicjuje wymuszone zamknięcie, będziesz musiał to wypróbować. Jest to jednak wbudowana opcja automatyzacji planowego wyłączania / zwiększania mocy.

  • Możesz także wymusić zamknięcie systemu za pomocą polecenia terminalu (wymaga roota):

    zamknij -h teraz

    Możesz umieścić to polecenie w zaplanowanym zadaniu uruchomionym lub cron . Sprawdź ten artykuł, aby uzyskać więcej informacji na temat tych dwóch usług.

  • Możesz także sprawdzić aplikację taką jak trafnie nazwana iWannaSleep (nie jestem pewien, czy to wymusza zamknięcie).

macaco
źródło
Co...??? Szukam aplikacji
Harry
2
Możesz sprawiać wrażenie mniej niewdzięcznego, ale jeśli ponownie przeczytasz moją odpowiedź, zobaczysz, że polecam aplikację, a jeśli wykonasz trochę niezależnych badań, zobaczysz, że jest jeszcze kilka aplikacji, które mają tę zdolność!
macaco
iWannaSleep to pierwszy wynik, który ludzie polecają w Google, i nie robi tego, co chcę. A ty polecasz mi nauczyć się czegoś uniksowego, żeby wyłączyć komputer?
Harry
3
Polecam, ponieważ jest to skuteczny sposób na osiągnięcie tego, co chcesz za pomocą wbudowanych narzędzi. Jeśli nie możesz znaleźć aplikacji, która odpowiada Twoim potrzebom, być może zajrzysz do czegoś podobnego do mojej sugestii.
macaco
1
Oszczędzanie energii »Harmonogram nie jest dobrą odpowiedzią, ponieważ poprosi użytkownika o 10 minut przed wyłączeniem i zaproponuje anulowanie procesu.
TJ Luoma,
3

Możesz użyć shutdownbezpośrednio, aby zaplanować zamknięcie w dowolnym momencie w przyszłości:

shutdown -h time

gdzie czas określa przyszły czas w jednym z dwóch formatów: + liczba lub rrmmddggmm, gdzie rok, miesiąc i dzień mogą być domyślnie ustawione na bieżące wartości systemowe. Pierwsza forma obniża system w liczbie minut, a druga w określonym czasie bezwzględnym.

nohillside
źródło
2
cd ~/Downloads/

curl --remote-name http://dl.dropbox.com/u/18414/ase/com.tjluoma.forceshutdown.plist

# Zobacz notkę poniżej

sudo mv com.tjluoma.forceshutdown.plist /Library/LaunchAgents

sudo chown root:wheel /Library/LaunchAgents/com.tjluoma.forceshutdown.plist

sudo launchctl load /Library/LaunchAgents/com.tjluoma.forceshutdown.plist

Uwaga:

Jak napisano, plist spowoduje codzienne zamykanie komputera o 23:00 (czasu lokalnego).

Jeśli chcesz zmienić czas, edytuj skrypt w dowolnym edytorze tekstu. Zmień klucze godziny i minuty, tutaj:

<dict>
    <key>Hour</key>
    <integer>23</integer>
    <key>Minute</key>
    <integer>0</integer>
</dict>

(zwróć uwagę na użycie 24-godzinnego czasu)

TJ Luoma
źródło
2

Lepsze zaplanowane zamknięcie

Jeśli chcesz bezpiecznie zamknąć komputer Mac w zaplanowanym czasie, rozważ Power Manager ; ładnie się wyłącza, nie pozwalając aplikacjom blokować procesu:

  • Wszyscy aktywni użytkownicy otrzymują wystarczające powiadomienie.
  • Duże ostrzeżenie jest wyświetlane na krótko przed rozpoczęciem wyłączania.
  • Uruchamiane aplikacje są ładnie proszone o zakończenie.
  • Aplikacje ignorujące miłe żądanie są mocniej zamknięte.
  • Wyloguj się, aby zakończyć, zanim komputer Mac zostanie ostatecznie zamknięty.

Nieuczciwej aplikacji lub procesowi bardzo trudno jest zablokować te kroki.

Dlaczego nie shutdown

Za pomocą shutdown spowoduje wymuszenie zakończenia wszystkich procesów na komputerze Mac, w tym aplikacji graficznych. W przypadku wielu aplikacji jest to zachowanie agresywne i nie zapewnia aplikacji dużej możliwości zapisania stanu lub danych.

Asystent harmonogramu

Program Power Manager zawiera zadanie Asystenta harmonogramu służące do zamykania systemu zgodnie z harmonogramem .

Power Manager - wyłącz codzienne zadanie

Ujawnienie: Współpracuję z firmą, która tworzy Power Managera.

Graham Miln
źródło
0

Rzuciłbym okiem na tę notatkę techniczną Apple

Samantha Catania
źródło
Dzięki, co mam teraz robić?
Harry
możesz użyć SendAppleEventToSystemProcess (kAEShutDown), a następnie możesz użyć polecenia killall -u nazwa użytkownika, aby zabić wszystkie aplikacje (ponieważ nie chcesz, aby można je było anulować), możesz również sprawdzić klasę timera: developer.apple.com/library/ mac / # dokumentacja / Cocoa / Reference /…
Samantha Catania
1
Świetny artykuł, ale OP zastanawiał się nad użyciem crona lub uruchomieniem go, wątpię, żeby chciał napisać własne rozwiązanie tego problemu.
macaco
1
Chociaż teoretycznie może to odpowiedzieć na pytanie, lepiej byłoby zawrzeć tutaj istotne części odpowiedzi i podać odnośnik.
daviesgeek