V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
darknoll
V2EX  ›  程序员

有没有什么方法能让 go 写的命令行程序在 windows 上以服务的方式运行

  •  
  •   darknoll · 2021-06-11 08:47:26 +08:00 · 5073 次点击
    这是一个创建于 1246 天前的主题,其中的信息可能已经有所发展或是发生改变。

    以 windows 服务的方式运行,避免误关闭之类的操作

    26 条回复    2022-08-09 12:07:38 +08:00
    fhy1994
        1
    fhy1994  
       2021-06-11 08:51:59 +08:00
    在 win 上用 nssm 跑过 nginx 、php-cgi 、python 打包的可执行程序
    a342191555
        2
    a342191555  
       2021-06-11 08:54:54 +08:00 via iPhone
    github.com/chai2010/winsvc 这个包可以

    如果用网络访问的话,记得还要在防火墙添加例外
    iminto
        3
    iminto  
       2021-06-11 08:56:03 +08:00   ❤️ 1
    用自带的 sc create 命令就行,也可以用一些第三方的 wrapper,比如 winsw
    catcn
        4
    catcn  
       2021-06-11 08:59:38 +08:00
    2 楼的这个是正解,用过。
    chenyi
        5
    chenyi  
       2021-06-11 09:01:07 +08:00
    nssm 用过,可以实现
    Rwing
        6
    Rwing  
       2021-06-11 09:04:02 +08:00   ❤️ 2
    不考虑一下 C#吗,也可以跨平台,独立文件分发,不用运行时。最主要的,可以很爽的用泛型 🙂
    zengming00
        7
    zengming00  
       2021-06-11 09:08:01 +08:00
    如果你还玩 nodejs 的话,pm2 是个不错的选择,因为在所有平台都通用
    直接一条命令搞定(注意你的程序与参数之间有两个减号)
    pm2 start 你的程序 -- 传递给你程序的参数
    tsungkang
        8
    tsungkang  
       2021-06-11 09:09:17 +08:00
    纯粹只考虑 windows 服务的话,可以直接 golang.org/x/sys/windows/svc 一把梭
    araraloren
        9
    araraloren  
       2021-06-11 09:14:04 +08:00
    @Rwing 很爽的泛型 哈哈。。
    anubu
        10
    anubu  
       2021-06-11 09:27:54 +08:00   ❤️ 1
    对比过 nssm 和 winsw,nssm 虽然较久没更新,但更好用。最简单的方法是使用 powershell 命令,两三句命令就能搞定,如果不考虑大量程序管理维护的话,是不错的方法。
    dream4ever
        12
    dream4ever  
       2021-06-11 09:31:30 +08:00
    @zengming00 PM2 +1,公司买的阿里云服务器装的是 Windows Server 2012,之前解决了 PM2 在注销远程桌面连接后会自动退出的问题后,就彻底省心了,PM2 从几年前用到现在,很方便。
    iseki
        13
    iseki  
       2021-06-11 09:57:18 +08:00
    @anubu 欸,一直想不起来这个好用的叫什么名字,这下好了
    mmtromsb456
        14
    mmtromsb456  
       2021-06-11 11:23:55 +08:00
    PhaSelEza
        15
    PhaSelEza  
       2021-06-11 11:28:19 +08:00   ❤️ 1
    如果只是要后台运行,而且程序不需要接受命令行输入的话,可以用:
    if len(os.Args) == 1 {
    exec.Command("cmd.exe", "/C", "start", "/B", os.Args[0], "flag").Run()
    os.Exit(0)
    }
    syscall.NewLazyDLL("kernel32.dll").NewProc("FreeConsole").Call()
    0o0O0o0O0o
        16
    0o0O0o0O0o  
       2021-06-11 11:31:29 +08:00 via iPhone
    建议用 winsw 专门来做这个事
    johnsona
        17
    johnsona  
       2021-06-11 11:36:17 +08:00 via iPhone
    nssm
    anubu
        18
    anubu  
       2021-06-11 11:46:58 +08:00
    @mmtromsb456 是的,简单够用,无额外依赖。
    g00001
        19
    g00001  
       2021-06-11 14:57:27 +08:00
    emric
        20
    emric  
       2021-06-11 15:03:37 +08:00
    我写过 bat 就那么几句命令,简单的很。
    https://gist.github.com/17/8853168
    bigtan
        21
    bigtan  
       2021-06-11 15:24:14 +08:00 via iPhone
    @mmtromsb456 一直用 nssm,这个 cmdlet 感觉更优雅
    noroot
        22
    noroot  
       2021-06-11 17:04:41 +08:00
    codehz
        23
    codehz  
       2021-06-11 17:52:14 +08:00 via Android
    @PhaSelEza 这样会话退出以后还是会被干掉的(
    ch2
        24
    ch2  
       2021-06-11 18:00:55 +08:00
    nssm 是最好的,各种都试过
    lqzhgood
        25
    lqzhgood  
       2021-06-12 17:28:32 +08:00 via Android
    Pm2 windows 上服务有坑~
    只能说可用
    loveqianool
        26
    loveqianool  
       2022-08-09 12:07:38 +08:00
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5254 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 09:13 · PVG 17:13 · LAX 01:13 · JFK 04:13
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.