我有一个 upstart 作业,配置为运行一次性脚本,其中包含一些 virsh 命令来导入和启动虚拟机。此作业配置为start on started libvirt-bin
。
但是,我遇到了一个问题,libvirt-bin 服务启动并分叉,但实际上直到它开始监听其套接字时才可用。但是,一旦进程分叉,Upstart 就会认为该进程已启动,并且我的 virsh 命令会因为与 libvirt-bin 套接字的竞争条件而失败。
有没有办法只使用 Upstart 来解决这个问题,还是我需要在脚本中添加一个检查套接字的函数来防止它失败?我试过使用 upstart-socket-bridge 和 upstart-file-bridge,但无济于事。
这是在搭载 Upstart 1.12 的 Ubuntu 14.04 上运行的。
答案1
最简单的方法是在脚本启动时添加几秒钟的静态休眠。这可能不是理想的选择,原因有很多,特别是如果您更广泛地使用此脚本,因为休眠与 libvirt 启动没有直接联系。
最好让脚本检查 libvirt 是否确实已启动。您可以使用退出状态virsh connect
或检查 libvirtd 是否已绑定到套接字 (lsof) 来执行此操作。