Como posso fazer o Mac OS X executar um programa antes de desligar?


9

Estou tentando fazer com que o Mac OS X salve todas as minhas VMs do VirtualBox ao reiniciar. Eu já tenho um script que faz isso, mas preciso do OS X para executá-lo automaticamente antes de uma reinicialização.

Quando o Mac OS X é reiniciado, ele executa / sbin / reboot?

Ou de que outra forma isso poderia ser alcançado?



Isso não é uma duplicata. Não quero saber como executar um script ou programa ao sair. Quero saber como executar um script ou programa ao desligar.
Andrew J. Brehm

1
Você está certo. Não é uma duplicata exata. A resposta na pergunta vinculada aconselha o usuário a inserir seu script /etc/rc.shutdown.localpara executá-lo ao desligar. Parece que é isso que você está procurando.
5139 michaelmichael

Este site parece fazer essa reivindicação: hints.macworld.com/article.php?story=20051013141919568
Andrew J. Brehm

O método rc.shutdown.local não funciona.
Andrew J. Brehm

Respostas:


5

Embora a Apple recomende usar " launchd ", o mais fácil é criar um script de shell usando, por exemplo, o pico do Terminal:

pico /Users/Shared/logoutHook.sh

O arquivo pode conter algo como:

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

Em seguida, dê direitos de execução:

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

Por fim, conecte o script ao procedimento de logout:

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

Se você iniciar outro aplicativo, como ainda não testei, acho que pode ser útil avisar a mim e a você que:

  • Talvez seja necessário eliminar o sinal de desligamento para executar o que queremos;

  • Em seguida, envie um novo (cuidado para não matar o sinal enviado por nosso próprio
    script)…


Se você deseja remover o gancho:

sudo defaults delete com.apple.loginwindow LogoutHook

Se estiver usando " launchd ", a idéia seria capturar o sinal SIGTERM. Dê uma olhada em: /System/Library/LaunchDaemons/com.apple.shutdown_monitor.plist


4

O Launchd envia um aviso antecipado de desligamento a todos os scripts / daemons que possuem uma sub-rotina StopService () . Isso dá ao seu processo mais tempo para limpar.

Basta usar o launchd para iniciar o script e executá-lo em segundo plano até a hora de sair.

Após o encerramento dos serviços que receberam o aviso antecipado, todos os processos recebem um SIGTERMsinal alguns segundos antes de serem desativados SIGKILL.

Você pode criar um script que dorme e intercepte o SIGTERM para executar seu comando quando chegar a hora. Você precisará ver se isso permite tempo suficiente na prática para a execução dos comandos. Isso evita um pouco de codificação, mas não muito - geralmente é melhor criar um daemon a partir de um script de shell.


De uma perspectiva histórica - /sbin/reboote os níveis de execução nunca existiram no Darwin / OS X e rc.shutdownsão preteridos junto com o resto do tempo, rcque launchdé o chefe. Você pode usar o rc.shutdown no tiger ou mais cedo (não tenho uma dessas imagens à mão para checar no momento) Lion certamente removeu todos os vestígios do rc.d e init.d.

Você pode querer ver se o sleepwatcher ajudaria no seu caso. Eu não o uso há algum tempo - mas certamente tem como objetivo resolver seu dilema.


Acontece que "obsoleto" significa "não funciona". :-(
Andrew J. Brehm

Sim - os avisos começaram no Tiger e eu acho que foi embora com o Leopard - é difícil lembrar com todas as mudanças do leão correndo pelo meu cérebro.
bmike

Isso realmente complica as coisas e faz do Mac OS X uma plataforma de servidor muito ruim.
Andrew J. Brehm

O launchd é totalmente capaz de executar scripts no desligamento. Talvez eu deva editar a história e deixar esse fato mais claro. De que maneira o launchd falha na sua necessidade de executar um script no desligamento?
bmike

Não sei como executar o launchd executar scripts no desligamento. Eu uso o launchd para iniciar as coisas na inicialização.
Andrew J. Brehm
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.