go - 删除自己的二进制文件的可能性

标签 go

这里的背景是我在golang中创建了一个安装程序(跨平台但最初针对Windows)

我必须运行卸载过程。此过程的最后一步是删除我的应用程序二进制文件和另一个运行时文件。

我当前的方法是特定于 Windows 的,而且非常糟糕 - 无法确认该过程已完成 - 基本上我只是从命令行调用删除,使用 ping 来创建延迟,如下所示:

cmd := exec.Command("ping 127.0.0.1", "-n", "5", ">", "nul", "&&", "del", os.Args[0])
cmd.Start()
os.Exit(0)

正如我所说,这可行,但我希望能够在退出之前确认该过程已完成。我想象的解决方案是启动某种内存中的 goroutine,它可以在应用程序生命周期之外持续存在,而无需锁定文件。 - 这可能吗?

注意 - 我还考虑过创建第二个 golang 应用程序(或该应用程序的副本),它从临时目录中执行此删除操作(这至少会给我跨平台的能力),然后让操作系统删除该副本但从我读到的内容来看,Windows 在清除临时目录时并不是特别提示,所以我也不确定这是否理想。我希望安装/卸载周期使机器保持其发现时的相同状态

关于我如何实现这一目标还有其他建议吗?跨平台解决方案将是一个额外的好处。

更新 我建议的 ping 和删除解决方案实际上并没有像我希望的那样工作(至少对于系统文件夹中的文件来说)。我通过创建第二个 golang 应用程序来运行删除来解决这个问题,我将其生成到临时文件夹中,然后在注册表中创建一个 run_once 条目,以便在用户重新启动时删除该文件。

我仍然对这个解决方案不满意,感觉相当老套。

我对 Adrian 的澄清表示支持,但欢迎任何有关替代方法的建议。

最佳答案

launch some kind of in-memory goroutine that can persist beyond the application lifetime without locking the file. - Is this possible?

没有。应用程序的生命周期是完全二进制的——要么运行,要么不运行。它无法退出但仍继续运行。但是,您可以通过工程,在删除二进制文件之前优雅地停止您担心的应用程序的任何部分。实现将完全取决于您的应用程序,但这当然是可行的。例如,如果它是 Web 服务器,您可以正常停止 http.Server,然后在完成后删除二进制文件。

关于go - 删除自己的二进制文件的可能性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45817962/

相关文章:

unit-testing - 如何使用相互依赖的接口(interface)方法模拟结构

amazon-web-services - 如何通过 AWS ALB 公开 API 以接收 zip 文件

go - 错误 : failed post-processing: 820:39: missing ',' in argument list

pointers - Go 中独特的函数集合

mongodb - 如何通过MongoDB同步在两个不同服务器上运行的两个应用

go - 如何遍历 Go 模板中的列表

go - 如何在 golang 中将数组编码为二进制文件并将二进制文件编码为数组?

json - 将 JSON 对象中的两个值连接到 Go 中的 map[string]bool

Golang 将多个文件添加到 http 多部分请求

go - 如何在 time.Format 中删除毫秒值中的点