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 tutte le mie VM VirtualBox al riavvio. Ho già uno script che fa questo, ma ho bisogno di OS X per eseguire questo script automaticamente prima di riavviare.

Al riavvio di Mac OS X, viene eseguito / sbin / reboot?

O in quale altro modo si potrebbe ottenere questo risultato?



Questo non è un duplicato. Non voglio sapere come eseguire uno script o un programma quando esci. Voglio sapere come eseguire uno script o un programma quando si spegne.
Andrew J. Brehm,

1
Hai ragione. Non è un duplicato esatto. La risposta nella domanda collegata consiglia all'utente di inserire il proprio script /etc/rc.shutdown.localper eseguirlo quando viene chiuso. Sembra che sia quello che stai cercando.
michaelmichael,

Questo sito sembra fare questa affermazione: hints.macworld.com/article.php?story=20051013141919568
Andrew J. Brehm,

Il metodo rc.shutdown.local non funziona.
Andrew J. Brehm,

Risposte:


5

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

pico /Users/Shared/logoutHook.sh

Il file può contenere qualcosa di simile:

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

Quindi assegnare 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, dato che non l'ho testato, penso che potrebbe essere utile avvisare me e te che:

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

  • Quindi inviarne uno nuovo (attenzione a non uccidere il segnale inviato dal nostro stesso
    script) ...


Se si desidera rimuovere il gancio:

sudo defaults delete com.apple.loginwindow LogoutHook

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


4

Launchd invia un avviso tempestivo di arresti a tutti gli script / demoni che hanno una subroutine StopService () . Questo dà al processo il maggior tempo per ripulire.

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

Dopo che i servizi che hanno ricevuto l'avviso tempestivo si stanno chiudendo, tutti i processi ricevono un SIGTERMsegnale pochi secondi prima che SIGKILLli colpisca.

Potresti creare uno script che dorme e intrappola SIGTERM per eseguire il tuo comando quando arriva quel momento. Dovrai vedere se ciò consente in pratica abbastanza tempo per l'esecuzione dei comandi. Questo evita un po 'di codifica, ma non molto: in genere è meglio creare un demone da uno script di shell.


Da una prospettiva storica - /sbin/reboote i runlevel non sono mai esistiti su Darwin / OS X ed rc.shutdownè deprecato insieme al resto del rcmomento che launchdè il capo. Potresti essere in grado di utilizzare rc.shutdown su tiger o precedenti (non ho una di quelle immagini a portata di mano per controllare al momento) Lion ha sicuramente rimosso tutte le vestigia di rc.d e init.d.

Potresti voler vedere se lo sleepwatcher potrebbe aiutarti nel tuo caso. Non lo uso da un po 'di tempo, ma certamente mira a risolvere il tuo dilemma.


Risulta "deprecato" significa "non funziona". :-(
Andrew J. Brehm,

Sì - gli avvertimenti sono iniziati su Tiger e immagino che se ne sia andato con Leopard - è difficile ricordare con tutti i cambiamenti di Lion che mi correvano attorno.
bmike

Questo complica davvero le cose e rende Mac OS X una pessima piattaforma server.
Andrew J. Brehm,

launchd è in grado di eseguire script all'arresto. Forse dovrei modificare la storia e lasciare questo fatto più chiaro. In che modo launchd non riesce a eseguire uno script all'arresto?
bmike

Non so come fare in modo che gli script di avvio vengano lanciati allo spegnimento. Uso launchd per avviare le cose all'avvio.
Andrew J. Brehm,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.