Golang Go语言在Linux下编译的二进制程序如何设置开机启动
Golang Go语言在Linux下编译的二进制程序如何设置开机启动
请教下 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 启动程序和终端启动有啥区别,为何程序启动后有不同的输出?如何开机启动?
更多关于Golang Go语言在Linux下编译的二进制程序如何设置开机启动的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
工作路径不同
更多关于Golang Go语言在Linux下编译的二进制程序如何设置开机启动的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
完整路径
确实怀疑路径不同,但是我用的绝对路径
docker 编写 dockerfile 还是太麻烦了,go 在 docker 里似乎还有些小 trick,比如 gosu 什么的,不愿意搞
使用的绝对路径
装一个 supervisor 写一个配置文件搞定
#4 可能 pwd 不同导致程序行为不同,或者 uid 不同,或者其他什么什么什么。
建议不要 nohup 而是采用 daemonizer,比如 screen supervisor systemd
除了 supervisor
还可以 crontab
逃
systemd
用 systemd 守护 资源文件路径用绝对路径
抱歉,工作走开很久。刚刚试了下,supervisor 确实简单好用,不过又遇到问题了。
补充一点,stash 这个程序会占据终端输出,所以要放在后台。然而使用 supervisor 启动后,程序不停的启动退出,pid 一直在变,这有可能是啥原因
crontab 不知道能否把程序放在后台运行,supervisor 遇到程序一直启动退出的循环问题
systemd 要写 service 文件,还不确定能成功,我太懒了,想先把 supervisor 搞定再说
我这里有一个例子吧 golang 程序注册成服务,开机启动 https://github.com/hellojukay/systemd-demo
pm2 管理进程
你这程序不能前台运行?
其实 supervisor 是用 systemd 来管理的 启动退出可能是你程序崩了触发了重启机制
谢谢,晚上试试看
谢谢,这个没有试过,先尝试已掌握的知识上解决
谢谢,正是因为前台运行,会占用终端,在终端输出内容。我想转到后台,不用一直占着终端,以前我都是用 tmux 来解决的,但是不能重启,而且 ssh 你也知道这网络情况,上去一次真不容易
你用 supervisor 就不会占用终端了, 用 supervisor 的程序不要以 daemon 模式运行,直接前台启动就好了
systemd 最优
supervisor 次之
其他的不建议
systemd 最好,
默认的 supervisor 进程还得靠 systemd 来守护。。。。
#10 我试了下 wybiral/tube 在 screen 下和 supervisor 下都正常……
具体你应该 supervisorctl 进去用 tail 、tail <program> stderr 之类看看 log 。
我也是这个想法,但是没有成功,一个参数都没敢加,如果我的配置文件没错的话,效果和终端运行应该是差不多的,奈何总是退出
systemd 总是要学的,现在偷懒,想先把服务跑起来,以后再完善些
supervisor 还是要简单一点的
我的 vps 用的 root,supervisor 配置文件如下
[program:stash]
command=/root/stash/stash-linux
directory=/root/stash/
user=root
numprocs=1
screen 一定是没问题的。以前都用 screen 或 tmux 来运行 golang 的程序,现在想要进步一点
tail -100 stash 后提示
Warning: sys.stdout.encoding is set to iso8859-1, so Unicode output may fail. Check your LANG and PYTHONIOENCODING environment settings.
正在搜索解决方案
请检查你的 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 更简单一点,反正大头早已经配好了。
谢谢各位,使用 systemd 已经搞定了。
还是想知道出问题的原因,以后大家偶遇类似的问题或者解决方案,欢迎回来留言
除了用 supervisor 之类的,我记得还可以直接把 golang 的程序注册成系统服务: https://github.com/kardianos/service
好好学学 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 。
systemd 启动也算是服务吧,只不过没有同一名称叫服务
docker 白天各种事情,没有及时回复,抱歉。docker 确实是大杀器,我是因为方案看的太多,想一步到位,有时太过追求完美,所以 dockerfile 写的太复杂,反而忘记了解决问题的初衷,docker 确实是最优方案,我换一台 vps 测试看看
你这么说也没错。用这个的好处是不需要额外的第三方来管理(当然也带来了一些不足)。
docker 学习可以,但 docker 要解决的不是你问的这个问题
docker 也不 portable 啊 只能 x86linux
这个帖子讨论的是 daemon 化运行,而 docker 带来的额外优点,也就是我前面提的“portable”的意思是,在一台 vps 和另一台 vps 之间,快速迁移部署的能力。
在不同操作系统之间“可移植”某种意义上是个伪命题,这跟这个主题讨论的问题就不一样了,展开来讲也太长了。
点开 c 项目,发现了不得了的东西,收藏了