如何在关机前让Mac OS X运行程序?


9

我试图让Mac OS X在重新启动时保存我所有的VirtualBox VM。我已经有执行此操作的脚本,但是我需要OS X在重新启动之前自动运行此脚本。

Mac OS X重新启动时,它是否运行/ sbin / reboot?

还是可以通过其他方式实现?



这不是重复的。我不想知道注销时如何运行脚本或程序。我想知道关机时如何运行脚本或程序。
Andrew J. Brehm

1
你是对的。不是完全重复。链接问题中的答案建议用户在/etc/rc.shutdown.local关机时放入其脚本以运行它。听起来这就是您想要的。
michaelmichael 2011年


rc.shutdown.local方法不起作用。
Andrew J. Brehm

Answers:


5

尽管Apple建议使用“ launchd ”,但最简单的方法是使用例如Terminal的pico创建shell脚本:

pico /Users/Shared/logoutHook.sh

该文件可以包含以下内容:

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

然后赋予执行权:

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

最后,将脚本挂接到注销过程:

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

如果您启动另一个应用程序(因为我还没有对此进行测试),我认为警告自己和您可能会很有用:

  • 我们可能需要取消关闭信号来执行我们想要的操作;

  • 然后发送一个新的(注意不要杀死我们自己的
    脚本发送的信号)…


如果要删除挂钩:

sudo defaults delete com.apple.loginwindow LogoutHook

如果使用“ launchd ”,则将捕获SIGTERM信号。看看:/System/Library/LaunchDaemons/com.apple.shutdown_monitor.plist


4

Launchd向所有具有StopService()子例程的脚本/守护程序发送关闭预警。这为您的过程提供了最多的清理时间。

只需使用launchd启动脚本,并使其在后台运行,直到需要退出为止。

在获得预警的服务关闭之后,所有进程都会在SIGTERM发出信号之前几秒钟收到信号SIGKILL

您可以制作一个使SIGTERM休眠并捕获该脚本的脚本,以在该时间到来时运行您的命令。您将必须查看实践中是否有足够的时间来执行命令。这样可以避免一些编码,但是要少很多-通常最好是使用Shell脚本制作一个守护程序。


从历史的角度来看- /sbin/reboot运行级别在Darwin / OS X上从未存在过,rc.shutdownrc现在的其余部分(launchd老板)一起已被弃用。您可能可以在Tiger或更早的版本上使用rc.shutdown(我现在没有任何要检查的图像之一)Lion当然已经删除了rc.d和init.d的所有痕迹。

您可能想看看sleepwatcher是否可以帮助您解决问题。我已经有一段时间没有使用它了-但它的确旨在解决您的难题。


原来,“已弃用”表示“无效”。:-(
Andrew J. Brehm

是的-警告开始于老虎,我猜想它已经随着豹子而消失了-难以回想起所有狮子在我的脑海中奔跑的变化。
bmike

这确实使事情变得复杂,并使Mac OS X成为非常糟糕的服务器平台。
Andrew J. Brehm

启动完全有能力在关闭时运行脚本。也许我应该删掉历史,让这一事实更加明确。启动后,您以何种方式无法在关机时运行脚本?
bmike

我不知道如何在关机时创建启动的运行脚本。我使用launchd启动时启动。
Andrew J. Brehm
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.