我试图让Mac OS X在重新启动时保存我所有的VirtualBox VM。我已经有执行此操作的脚本,但是我需要OS X在重新启动之前自动运行此脚本。
Mac OS X重新启动时,它是否运行/ sbin / reboot?
还是可以通过其他方式实现?
/etc/rc.shutdown.local
关机时放入其脚本以运行它。听起来这就是您想要的。
我试图让Mac OS X在重新启动时保存我所有的VirtualBox VM。我已经有执行此操作的脚本,但是我需要OS X在重新启动之前自动运行此脚本。
Mac OS X重新启动时,它是否运行/ sbin / reboot?
还是可以通过其他方式实现?
/etc/rc.shutdown.local
关机时放入其脚本以运行它。听起来这就是您想要的。
Answers:
尽管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
Launchd向所有具有StopService()子例程的脚本/守护程序发送关闭预警。这为您的过程提供了最多的清理时间。
只需使用launchd启动脚本,并使其在后台运行,直到需要退出为止。
在获得预警的服务关闭之后,所有进程都会在SIGTERM
发出信号之前几秒钟收到信号SIGKILL
。
您可以制作一个使SIGTERM休眠并捕获该脚本的脚本,以在该时间到来时运行您的命令。您将必须查看实践中是否有足够的时间来执行命令。这样可以避免一些编码,但是要少很多-通常最好是使用Shell脚本制作一个守护程序。
从历史的角度来看- /sbin/reboot
运行级别在Darwin / OS X上从未存在过,rc.shutdown
与rc
现在的其余部分(launchd
老板)一起已被弃用。您可能可以在Tiger或更早的版本上使用rc.shutdown(我现在没有任何要检查的图像之一)Lion当然已经删除了rc.d和init.d的所有痕迹。
您可能想看看sleepwatcher是否可以帮助您解决问题。我已经有一段时间没有使用它了-但它的确旨在解决您的难题。