Come posso fare in modo che Mac OS X esegua un programma prima di spegnerlo?

9

Sto cercando di ottenere Mac OS X per salvare tutti i miei VM VirtualBox al riavvio. Ho già uno script che fa questo, ma ho bisogno di OS X per eseguire questo script automaticamente prima del riavvio.

Quando Mac OS X si riavvia, esegue / sbin / reboot?

O in che altro modo si potrebbe ottenere ciò?

    
posta Andrew J. Brehm 05.07.2011 - 13:48
fonte

2 risposte

5

Sebbene Apple consiglia di utilizzare " launchd ", il più semplice è creare uno script di shell usando, ad esempio, il pico di Terminal:

pico /Users/Shared/logoutHook.sh

Il file può contenere qualcosa come:

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

Quindi dai i diritti di esecuzione:

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

Infine, aggancia lo script alla procedura di disconnessione:

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

Se avvii un'altra applicazione, poiché non l'ho ancora testata, penso che potrebbe essere utile avvisare me stesso e tu che:

  • Potremmo aver bisogno di uccidere il segnale di spegnimento per eseguire ciò che vogliamo;

  • Quindi inviane uno nuovo (fai attenzione a non uccidere il segnale inviato dal nostro stesso dispositivo sceneggiatura) ...

Se vuoi rimuovere il gancio:

sudo defaults delete com.apple.loginwindow LogoutHook

Se si utilizza " launchd ", l'idea sarebbe quella di acquisire il segnale SIGTERM. Dai un'occhiata a: /System/Library/LaunchDaemons/com.apple.shutdown_monitor.plist

    
risposta data 09.12.2013 - 17:33
fonte
4

Launchd invia un allarme precoce degli arresti a tutti gli script / demoni che hanno un Subroutine StopService () . Questo ti dà più tempo per pulire il tuo processo.

Basta usare launchd per avviare lo script e farlo funzionare in background fino al momento di uscire.

Dopo che i servizi che hanno ricevuto il preavviso si stanno chiudendo, Tutti i processi ricevono un segnale SIGTERM alcuni secondi prima che SIGKILL li segnali.

Potresti creare uno script che dorme e intercetta SIGTERM per eseguire il comando quando verrà il momento. Dovrete vedere se ciò consente abbastanza tempo nella pratica per i comandi da eseguire. Questo evita un po 'di codifica, ma non di molto: in genere è meglio semplicemente creare un daemon con uno script di shell.

Da una prospettiva storica - /sbin/reboot e runlevel non sono mai esistiti su Darwin / OS X e rc.shutdown è deprecato insieme al resto di rc ora che launchd è il boss. Potresti essere in grado di usare rc.shutdown su tiger o prima (non ho una di queste immagini a portata di mano per controllare al momento). Lion ha sicuramente rimosso tutti i resti di rc.d e init.d.

Potresti voler vedere se sleepwatcher ti aiuterà nel tuo caso. Non l'ho usato da un po 'di tempo - ma certamente ha lo scopo di risolvere il tuo dilemma.

    
risposta data 16.07.2011 - 00:02
fonte

Leggi altre domande sui tag