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

2021-06-11 08:47:26 +08:00
 darknoll

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

4842 次点击
所在节点    程序员
26 条回复
fhy1994
2021-06-11 08:51:59 +08:00
在 win 上用 nssm 跑过 nginx 、php-cgi 、python 打包的可执行程序
a342191555
2021-06-11 08:54:54 +08:00
github.com/chai2010/winsvc 这个包可以

如果用网络访问的话,记得还要在防火墙添加例外
iminto
2021-06-11 08:56:03 +08:00
用自带的 sc create 命令就行,也可以用一些第三方的 wrapper,比如 winsw
catcn
2021-06-11 08:59:38 +08:00
2 楼的这个是正解,用过。
chenyi
2021-06-11 09:01:07 +08:00
nssm 用过,可以实现
Rwing
2021-06-11 09:04:02 +08:00
不考虑一下 C#吗,也可以跨平台,独立文件分发,不用运行时。最主要的,可以很爽的用泛型 🙂
zengming00
2021-06-11 09:08:01 +08:00
如果你还玩 nodejs 的话,pm2 是个不错的选择,因为在所有平台都通用
直接一条命令搞定(注意你的程序与参数之间有两个减号)
pm2 start 你的程序 -- 传递给你程序的参数
tsungkang
2021-06-11 09:09:17 +08:00
纯粹只考虑 windows 服务的话,可以直接 golang.org/x/sys/windows/svc 一把梭
araraloren
2021-06-11 09:14:04 +08:00
@Rwing 很爽的泛型 哈哈。。
anubu
2021-06-11 09:27:54 +08:00
对比过 nssm 和 winsw,nssm 虽然较久没更新,但更好用。最简单的方法是使用 powershell 命令,两三句命令就能搞定,如果不考虑大量程序管理维护的话,是不错的方法。
Jirajine
2021-06-11 09:29:24 +08:00
dream4ever
2021-06-11 09:31:30 +08:00
@zengming00 PM2 +1,公司买的阿里云服务器装的是 Windows Server 2012,之前解决了 PM2 在注销远程桌面连接后会自动退出的问题后,就彻底省心了,PM2 从几年前用到现在,很方便。
iseki
2021-06-11 09:57:18 +08:00
@anubu 欸,一直想不起来这个好用的叫什么名字,这下好了
mmtromsb456
2021-06-11 11:23:55 +08:00
PhaSelEza
2021-06-11 11:28:19 +08:00
如果只是要后台运行,而且程序不需要接受命令行输入的话,可以用:
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
2021-06-11 11:31:29 +08:00
建议用 winsw 专门来做这个事
johnsona
2021-06-11 11:36:17 +08:00
nssm
anubu
2021-06-11 11:46:58 +08:00
@mmtromsb456 是的,简单够用,无额外依赖。
g00001
2021-06-11 14:57:27 +08:00
emric
2021-06-11 15:03:37 +08:00
我写过 bat 就那么几句命令,简单的很。
https://gist.github.com/17/8853168

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/782796

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX