Jak zmusić system Mac OS X do uruchomienia programu przed jego zamknięciem?


9

Próbuję zmusić system Mac OS X do zapisania wszystkich maszyn wirtualnych VirtualBox po ponownym uruchomieniu. Mam już skrypt, który to robi, ale potrzebuję OS X, aby uruchomić ten skrypt automatycznie przed ponownym uruchomieniem.

Czy po ponownym uruchomieniu Mac OS X uruchamia się / sbin / reboot?

Lub jak inaczej można to osiągnąć?



To nie jest duplikat. Nie chcę wiedzieć, jak uruchomić skrypt lub program podczas wylogowywania. Chcę wiedzieć, jak uruchomić skrypt lub program podczas zamykania.
Andrew J. Brehm,

1
Masz rację. Nie jest to dokładny duplikat. Odpowiedź w połączonym pytaniu zaleca użytkownikowi umieszczenie skryptu w /etc/rc.shutdown.localcelu uruchomienia go podczas zamykania. Wygląda na to, że tego właśnie szukasz.
michaelmichael


Metoda rc.shutdown.local nie działa.
Andrew J. Brehm,

Odpowiedzi:


5

Chociaż Apple zaleca użycie „ uruchomionego ”, najłatwiej jest utworzyć skrypt powłoki, używając na przykład pico terminalu:

pico /Users/Shared/logoutHook.sh

Plik może zawierać coś takiego:

#!/bin/bash
say 'Hasta la vista baby!'

Następnie daj uprawnienia egzekucyjne:

sudo chmod +x /Users/Shared/logoutHook.sh

Na koniec podpisz skrypt do procedury wylogowania:

sudo defaults write com.apple.loginwindow LogoutHook /Users/Shared/logoutHook.sh

Jeśli uruchomisz inną aplikację, ponieważ nie przetestowałem tego, myślę, że może być przydatne ostrzeżenie siebie i ciebie, że:

  • Być może będziemy musieli zabić sygnał wyłączenia, aby wykonać to, co chcemy;

  • Następnie wyślij nowy (uważaj, aby nie zabić sygnału wysyłanego przez nasz własny
    skrypt)…


Jeśli chcesz usunąć hak:

sudo defaults delete com.apple.loginwindow LogoutHook

Jeśli używasz „ uruchomionego ”, pomysłem byłoby przechwycenie sygnału SIGTERM. Zobacz: /System/Library/LaunchDaemons/com.apple.shutdown_monitor.plist


4

Launchd wysyła wczesne ostrzeżenie o wyłączeniu do wszystkich skryptów / demonów, które mają podprogram StopService () . Daje to procesowi najwięcej czasu na oczyszczenie.

Wystarczy uruchomić, aby uruchomić skrypt i uruchomić go w tle, aż nadejdzie czas, aby wyjść.

Po zamknięciu usług, które otrzymały wczesne ostrzeżenie, wszystkie procesy otrzymują SIGTERMsygnał na kilka sekund przed SIGKILLnimi.

Możesz stworzyć skrypt, który śpi i zatrzymuje SIGTERM, aby uruchomić twoje polecenie, kiedy nadejdzie ten czas. Będziesz musiał sprawdzić, czy daje to w praktyce wystarczająco dużo czasu na wykonanie poleceń. Pozwala to uniknąć trochę kodowania, ale niewiele - na ogół lepiej jest zrobić demona ze skryptu powłoki.


Z historycznego punktu widzenia - /sbin/rebooti poziomy działania nigdy nie istniały w systemie Darwin / OS X i rc.shutdownsą przestarzałe, podobnie jak reszta rcobecnie, która launchdjest szefem. Być może będziesz mógł użyć rc.shutdown na tygrysie lub wcześniejszych (nie mam obecnie żadnego z tych zdjęć do sprawdzenia) Lion z pewnością usunął wszystkie ślady rc.d i init.d.

Możesz sprawdzić, czy Sleepwatcher pomoże w twoim przypadku. Nie używałem go od dłuższego czasu - ale z pewnością ma na celu rozwiązanie twojego dylematu.


Okazuje się, że „przestarzałe” oznacza „nie działa”. :-(
Andrew J. Brehm

Tak - ostrzeżenia rozpoczęły się na Tygrysie i domyślam się, że zniknęły wraz z Leopardem - trudno przypomnieć sobie wszystkie zmiany Lwa biegnące w moim mózgu.
bmike

To naprawdę komplikuje sprawy i sprawia, że ​​Mac OS X jest bardzo złą platformą serwerową.
Andrew J. Brehm

launchd jest w pełni zdolny do uruchamiania skryptów podczas zamykania systemu. Być może powinienem zredagować historię i pozostawić ten fakt jaśniej. W jaki sposób uruchomienie nie powiedzie się podczas uruchamiania skryptu?
bmike

Nie wiem, jak uruchomić uruchamiane skrypty podczas zamykania systemu. Używam launchd, aby uruchamiać rzeczy podczas rozruchu.
Andrew J. Brehm,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.