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

时间:2017-08-22 12:41:16

标签: go

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

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

我目前的方法是特定于Windows并且相当差 - 无法确认进程已完成 - 基本上我只是从命令行调用delete,使用ping来创建延迟,如下所示:

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

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

注意 - 我还考虑创建第二个golang应用程序(或者这个应用程序的副本),它从temp目录执行此删除(这至少会让我跨平台),然后让操作系统删除该副本但是从我读过的窗口来看,清除临时目录并不是特别迅速,所以我也不确定这是不是理想的。我希望安装/卸载周期让机器处于与它相同的状态

关于我如何实现这一目标的任何其他建议?跨平台解决方案将是一个奖励。

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

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

我赞成Adrian的澄清,但欢迎任何有关替代方法的建议。

1 个答案:

答案 0 :(得分:3)

  

启动某种内存goroutine,它可以在应用程序生命周期内持续存在而不会锁定文件。 - 这可能吗?

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