【问题标题】:Possibilities for deleting own binary删除自己的二进制文件的可能性
【发布时间】:2017-09-29 02:26:53
【问题描述】:

这里的背景是我在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 应用程序(或这个应用程序的副本),它从临时目录中执行此删除操作(至少可以让我跨平台),然后让操作系统删除该副本但从我读过的内容来看,windows 在清除临时目录时并不是特别提示,所以我也不确定这是否理想。我希望安装/卸载循环使机器保持与找到它时相同的状态

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

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

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

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

【问题讨论】:

    标签: go


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您确认想象中的解决方案将保持不变:) - 当您说“停止您担心的应用程序的任何部分”时,我在最后阶段运行的只是一个 gui(使用一个 dll),我杀了它,所以我作为 cmd 行应用程序运行。但仍然是 golang 的删除方法,例如 os.Remove(os.Args[0]) 不起作用,所以它仍然给我留下 ping 等待删除解决方案以进行最终清理 - 这是否让您觉得是合理的解决方案,或者您是否正在考虑替代
    • 我没有足够的上下文来知道这是否合理 - 如果它有效,它有效,如果你对它不满意,找到一个更好的解决方案。
    猜你喜欢
    • 1970-01-01
    • 2017-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-09
    相关资源
    最近更新 更多