请教下 Linux 下 golang 编译的二进制程序开机启动

2020-06-24 10:52:16 +08:00
 la0wei
请教下 linux 下 golang 编译的二进制程序开机启动

背景:
需要一个伪装站,最好是视频类的,流量大点,所以想到用 golang 的程序,一般单文件,对我这种 linux 苦手再好不过。
找到这么几个
a https://github.com/wybiral/tube
b https://github.com/prologic/tube 从上一个 fork
c https://github.com/stashapp/stash

现象:
a 程序终端正常运行,rc.localnohup&启动无法运行,打印信息后看到
panic: html/template: pattern matches no files: `templates/*`

goroutine 1 [running]:
html/template.Must(...)
/home/davy/.go/src/html/template/template.go:372
github.com/wybiral/tube/pkg/app.NewApp(0xc000065290, 0xc0000652f0, 0x1, 0x8b8360)
/home/davy/go/src/github.com/wybiral/tube/pkg/app/app.go:54 +0xf06
main.main()
/home/davy/go/src/github.com/wybiral/tube/main.go:17 +0x224
panic: html/template: pattern matches no files: `templates/*`
上面的路径非我本机路径,应该是开发者的

b 程序终端正常运行,单文件,rc.localnohup&记不太清了,似乎是可以的

c 程序终端正常运行,单文件,rc.localnohup&启动无法运行,打印信息后看到
panic: Config File "config" Not Found in "[/ /.stash]"

goroutine 1 [running]:
github.com/stashapp/stash/pkg/manager.initConfig()
/stash/pkg/manager/manager.go:74 +0x2e6
github.com/stashapp/stash/pkg/manager.Initialize.func1()
/stash/pkg/manager/manager.go:43 +0x35
sync.(*Once).Do(0x274f2d8, 0x1cc6c38)
/usr/local/go/src/sync/once.go:44 +0xb3
github.com/stashapp/stash/pkg/manager.Initialize(0xc0001d9f88)
/stash/pkg/manager/manager.go:40 +0x39
main.main()
/stash/main.go:15 +0x22

疑问:rc.local 启动程序和终端启动有啥区别,为何程序启动后有不同的输出?如何开机启动?
4272 次点击
所在节点    Go 编程语言
31 条回复
no1xsyzy
2020-06-24 20:21:13 +08:00
请检查你的 locale,建议优先使用 UTF-8
https://wiki.archlinux.org/index.php/Locale_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)
可能导致 encoding/decoding 时 raise
顺便再看下 stderr 吧

有可能 stash 依赖 stdout 是 tty
实在不行还有定时 RunOnce=screen -dmS session_name program argv
但这个做法是邪道。

其实如果不考虑访问日志和 attach 的话 systemd 更简单一点,反正大头早已经配好了。
la0wei
2020-06-24 20:53:08 +08:00
@no1xsyzy 谢谢。编码已通过下面问题解决
export PYTHONIOENCODING="UTF-8"$PYTHONIOENCODING
这次 supervisor tail 不报错了,不过内容为空

我也不是头铁硬要用 supervisor,只是好奇为何程序启动后有不同的现象。
la0wei
2020-06-24 21:19:30 +08:00
@kuro1 @GeruzoniAnsasu @Tink @RubyJack @no1xsyzy @kiracyan @vinsec @54007 @chenqh @ruanimal @keepeye @caola
谢谢各位,使用 systemd 已经搞定了。
还是想知道出问题的原因,以后大家偶遇类似的问题或者解决方案,欢迎回来留言
askfermi
2020-06-24 21:30:04 +08:00
除了用 supervisor 之类的,我记得还可以直接把 golang 的程序注册成系统服务: https://github.com/kardianos/service
ttimasdf
2020-06-24 22:56:35 +08:00
好好学学 docker,dockerfile 编写比 systemd unit 要容易的多,且更通用。一个 golang 用 systemd 还能糊一下,一个 python 加一堆依赖用 systemd 咋整?再调个 bash,source 一下 pyenv ?

而且根本就不涉及什么 gosu 啊这这那那的,创建 golang 程序的 docker 容器是最最简单的。直接从 scratch 镜像初始化一个完全空白的容器,把编译好的 binary 丢进去就成了。我手把手教你写 dockerfile 。

FROM scratch
COPY ./your_exe /app/your_exe
COMMAND /app/your_exe

直接一 build 一 run 就完了!什么 screen supervisord pm2 systemd 那都是上世纪的东西了,除了配置复杂,显得很有技术含量之外,没有什么实际的优点,而且完全不 portable 。
la0wei
2020-06-26 02:14:47 +08:00
@askfermi systemd 启动也算是服务吧,只不过没有同一名称叫服务
@keepeye docker 白天各种事情,没有及时回复,抱歉。docker 确实是大杀器,我是因为方案看的太多,想一步到位,有时太过追求完美,所以 dockerfile 写的太复杂,反而忘记了解决问题的初衷,docker 确实是最优方案,我换一台 vps 测试看看
askfermi
2020-06-26 05:11:23 +08:00
@la0wei 你这么说也没错。用这个的好处是不需要额外的第三方来管理(当然也带来了一些不足)。
keepeye
2020-06-26 16:59:21 +08:00
@la0wei docker 学习可以,但 docker 要解决的不是你问的这个问题
julyclyde
2020-06-28 16:02:55 +08:00
@ttimasdf docker 也不 portable 啊 只能 x86linux
ttimasdf
2020-07-13 15:35:17 +08:00
@julyclyde 这个帖子讨论的是 daemon 化运行,而 docker 带来的额外优点,也就是我前面提的“portable”的意思是,在一台 vps 和另一台 vps 之间,快速迁移部署的能力。

在不同操作系统之间“可移植”某种意义上是个伪命题,这跟这个主题讨论的问题就不一样了,展开来讲也太长了。
revalue
2020-08-24 18:35:28 +08:00
@la0wei 点开 c 项目,发现了不得了的东西,收藏了

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

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

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

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

© 2021 V2EX