我正在运行 Ubuntu 服务器,使用 upstart 作业托管虚拟机。我让它在启动时启动,并在退出时关闭主机,但我似乎无法让它在主机关闭时暂停。如果我使用initctl stop vmservice
,则暂停会正确发生 - 但如果我用shutdown -h now
或reboot
,它看起来就像被杀死了(我尝试在停止前脚本中放置一个 sleep ,其行为相同)。任何帮助都将不胜感激。
我对 upstart 还很陌生,因此我也很感谢任何其他反馈(包括,我在停止后调用 shutdown 是否做了“正确”的事情?)。
我的工作(“启动”从 kdm.conf 中提取;.startvm 和 .stopvm 只是启动和暂停虚拟机):
start on (filesystem
and started dbus
and (graphics-device-added fb0 PRIMARY_DEVICE_FOR_DISPLAY=1
or drm-device-added card0 PRIMARY_DEVICE_FOR_DISPLAY=1
or stopped udevtrigger))
stop on runlevel [016]
pre-stop script
exec su -c "/home/unprivileged_user/.stopvm" - unprivileged_user
end script
env XORGCONFIG=/etc/X11/xorg.conf
exec su -c "xinit /home/unprivileged_user/.startvm -- /etc/X11/xinit/xserverrc :0" - unprivileged_user
post-stop script
shutdown -h now
end script
答案1
Upstart 将在等待预停止或发送到主进程的信号 5 秒后发送 SIGKILL(即 kill -9)。
使用
kill timeout 10
给自己 10 秒钟的时间等待死机。实际上你不能给自己超过这个时间,因为关机只会等待 10 秒钟让所有进程死机,然后才会完全关闭。确保你的虚拟机已停止前整个系统关闭开始:
用这个:
stop on starting rc RUNLEVEL=[016]
这将确保您的虚拟机在系统开始正常关机程序之前完全停止(尽管终止超时仍然有效,因此也要提高它!)
另外,虽然您似乎已经从 gdm 或 lightdm 复制了它,但您的 SUPER 复杂启动实际上根本没有必要。
如果您只是希望在显示管理器运行时运行虚拟机,则这要简单得多:
start on started lightdm or started gdm