V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
ropon
V2EX  ›  Go 编程语言

go 编写更新程序改名自删疑问

  •  
  •   ropon ·
    ropon · 2020-05-11 15:49:46 +08:00 · 2565 次点击
    这是一个创建于 1656 天前的主题,其中的信息可能已经有所发展或是发生改变。

    需求:

    • 根据操作系统检查更新
    • 更新后自动改名运行,原程序自删

    疑问:

    • Windows 平台 运行 demo.exe 检查更新下载最新版本保存 demo_1.1.exe ,如何自动改名 demo.exe 并自删原程序
    • Linux 平台 运行 demo 检查更新下载最新版本保存 demo_1.1_amd64,如何自动改名 demo 并自删原程序
    18 条回复    2020-05-11 17:53:55 +08:00
    davidyanxw
        1
    davidyanxw  
       2020-05-11 16:01:13 +08:00
    你这是要写个病毒?
    neoblackcap
        2
    neoblackcap  
       2020-05-11 16:10:27 +08:00
    下载完了,校验然后就退出原来的程序,启动一个清理程序清理以及改名不就可以了?
    hwdef
        3
    hwdef  
       2020-05-11 16:20:24 +08:00
    启动第三个程序,
    a b c
    a 升级为 b
    a 退出 调用 c 删除 a
    ropon
        4
    ropon  
    OP
       2020-05-11 16:28:03 +08:00
    @hwdef 一个程序能实现吗
    hwdef
        5
    hwdef  
       2020-05-11 16:30:52 +08:00
    或者 a 就不做这些功能,,,,c 一直在监控,,更新删除都由 c 来做。
    hwdef
        6
    hwdef  
       2020-05-11 16:31:18 +08:00
    @ropon 一个程序应该不行吧,,,会占用着,,删不掉。。
    hwdef
        7
    hwdef  
       2020-05-11 16:31:58 +08:00
    估计要看看底层了。。。让程序运行在内存,,然后删掉自己,,否则会一直锁着吧,,,不懂。。。
    wafm
        8
    wafm  
       2020-05-11 16:32:26 +08:00
    我在写桌面程序的时候是做了一个中转应用执行脚本去操作的
    actar
        9
    actar  
       2020-05-11 16:33:31 +08:00   ❤️ 1
    a 更新,下载 a_update
    a 启动 a_update,传参,a 退出
    a_update 删除 a
    a_update 复制 a_update 到 a
    a_update 启动 a,传参,a_update 退出
    a 删除 a_update
    actar
        10
    actar  
       2020-05-11 16:33:57 +08:00
    DefoliationM
        11
    DefoliationM  
       2020-05-11 16:34:27 +08:00
    第一个程序检测到更新的时候,调用第二个程序(更新程序),结束第一个程序进程并进行更新,然后启动更新后的程序,最后结束更新程序。
    None123
        12
    None123  
       2020-05-11 16:35:29 +08:00
    写病毒还是外挂?
    DefoliationM
        13
    DefoliationM  
       2020-05-11 16:36:52 +08:00
    linux 下即使程序在运行也能删除运行文件,但是程序不会结束,会在目录下留下一个.开头的临时文件,所以在 linux 下可以直接替换,但是需要手动重启一下程序。windows 下就不清楚了。
    Vegetable
        14
    Vegetable  
       2020-05-11 16:38:46 +08:00
    linux 好像可以吧
    - 下载新的
    - 把自己删了
    - 把新的改名为自己的文件名
    - 退出
    windows 一个程序可能有点难
    actar
        15
    actar  
       2020-05-11 16:44:36 +08:00
    windows 下,os.Rename() ,可以直接改名。没法直接删除。os.Remove 报 Access is denied.
    lniwn
        16
    lniwn  
       2020-05-11 16:59:21 +08:00
    这种一般都可以释放一个中间脚本来完成的,windows 释放 bat,linux 释放 sh 或者 python
    ropon
        17
    ropon  
    OP
       2020-05-11 17:29:40 +08:00
    execve(pathname, argv, envp) 加载一个新程序(路径名为 pathname,参数列表为 argv,环境变量列表为 envp )到当前进程的内存。这将丢弃现存的程序文本段,并为新程序重新创建栈、数据段以及堆。通常将这一动作称为执行一个新程序。
    janxin
        18
    janxin  
       2020-05-11 17:53:55 +08:00
    一般都是有一个专门的更新程序去做,防止出错
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1232 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 23:56 · PVG 07:56 · LAX 15:56 · JFK 18:56
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.