请教下 Linux 下 golang 编译的二进制程序开机启动 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
la0wei
V2EX    Go 编程语言

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

  •  
  •   la0wei 2020-06-24 10:52:16 +08:00 4654 次点击
    这是一个创建于 1947 天前的主题,其中的信息可能已经有所发展或是发生改变。
    请教下 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 启动程序和终端启动有啥区别,为何程序启动后有不同的输出?如何开机启动?
    第 1 条附言    2020-06-24 17:30:26 +08:00
    我的疏忽,表达不到位。
    除了开机启动,另外需要程序在后台运行。
    直接在终端运行的话,程序是前台运行,会输出日志。
    31 条回复    2020-08-24 18:35:28 +08:00
    kuro1
        1
    kuro1  
       2020-06-24 11:03:12 +08:00   1
    工作路径不同
    GeruzoniAnsasu
        2
    GeruzoniAnsasu  
       2020-06-24 11:07:45 +08:00   1
    https://github.com/stashapp/stash/blob/develop/docker/build/x86_64/Dockerfile

    这不是有 docker 吗
    开机把容器拉起来就好了,有这么纠结?
    Tink
        3
    Tink  
    PRO
       2020-06-24 11:39:11 +08:00   1
    完整路径
    la0wei
        4
    la0wei  
    OP
       2020-06-24 11:53:04 +08:00
    @kuro1 确实怀疑路径不同,但是我用的绝对路径
    @GeruzoniAnsasu docker 编写 dockerfile 还是太麻烦了,go 在 docker 里似乎还有些小 trick,比如 gosu 什么的,不愿意搞
    @Tink 使用的绝对路径
    RubyJack
        5
    RubyJack  
       2020-06-24 11:54:02 +08:00   2
    装一个 supervisor 写一个配置文件搞定
    no1xsyzy
        6
    no1xsyzy  
       2020-06-24 12:38:05 +08:00   1
    @la0wei #4 可能 pwd 不同导致程序行为不同,或者 uid 不同,或者其他什么什么什么。
    建议不要 nohup 而是采用 daemonizer,比如 screen supervisor systemd
    zjsxwc
        7
    zjsxwc  
       2020-06-24 13:11:12 +08:00   1
    除了 supervisor
    还可以 crontab @reboot
    kiracyan
        8
    kiracyan  
       2020-06-24 14:11:44 +08:00   1
    systemd
    vinsec
        9
    vinsec  
       2020-06-24 14:25:35 +08:00   1
    用 systemd 守护 资源文件路径用绝对路径
    la0wei
        10
    la0wei  
    OP
       2020-06-24 15:56:38 +08:00
    @RubyJack @no1xsyzy
    抱歉,工作走开很久。刚刚试了下,supervisor 确实简单好用,不过又遇到问题了。
    补充一点,stash 这个程序会占据终端输出,所以要放在后台。然而使用 supervisor 启动后,程序不停的启动退出,pid 一直在变,这有可能是啥原因

    @zjsxwc crontab 不知道否把程序放在后台运行,supervisor 遇到程序一直启动退出的循环问题

    @kiracyan @vinsec systemd 要写 service 文件,还不确定能成功,我太懒了,想先把 supervisor 搞定再说
    54007
        11
    54007  
       2020-06-24 16:13:20 +08:00   1
    我这里有一个例子吧 golang 程序注册成服务,开机启动 https://github.com/hellojukay/systemd-demo
    fanpei0121
        12
    fanpei0121  
       2020-06-24 16:43:24 +08:00   1
    pm2 管理进程
    chenqh
        13
    chenqh  
       2020-06-24 16:43:47 +08:00   1
    @la0wei 你这程序不能前台运行?
    kiracyan
        14
    kiracyan  
       2020-06-24 17:02:06 +08:00   1
    @la0wei 其实 supervisor 是用 systemd 来管理的 启动退出可能是你程序崩了触发了重启机制
    la0wei
        15
    la0wei  
    OP
       2020-06-24 17:28:36 +08:00
    @54007 谢谢,晚上试试看
    @fanpei0121 谢谢,这个没有试过,先尝试已掌握的知识上解决
    @chenqh 谢谢,正是因为前台运行,会占用终端,在终端输出内容。我想转到后台,不用一直占着终端,以前我都是用 tmux 来解决的,但是不能重启,而且 ssh 你也知道这网络情况,上去一次真不容易
    ruanimal
        16
    ruanimal  
       2020-06-24 17:51:00 +08:00   1
    @la0wei 你用 supervisor 就不会占用终端了, 用 supervisor 的程序不要以 daemon 模式运行,直接前台启动就好了
    keepeye
        17
    keepeye  
       2020-06-24 18:10:07 +08:00   1
    systemd 最优
    supervisor 次之
    其他的不建议
    caola
        18
    caola  
       2020-06-24 18:16:19 +08:00   1
    systemd 最好,
    默认的 supervisor 进程还得靠 systemd 来守护。。。。
    no1xsyzy
        19
    no1xsyzy  
       2020-06-24 19:46:12 +08:00   1
    @la0wei #10 我试了下 wybiral/tube 在 screen 下和 supervisor 下都正常……
    具体你应该 supervisorctl 进去用 tail 、tail <program> stderr 之类看看 log 。
    la0wei
        20
    la0wei  
    OP
       2020-06-24 20:06:24 +08:00
    @ruanimal 我也是这个想法,但是没有成功,一个参数都没敢加,如果我的配置文件没错的话,效果和终端运行应该是差不多的,奈何总是退出

    @keepeye systemd 总是要学的,现在偷懒,想先把服务跑起来,以后再完善些

    @caola supervisor 还是要简单一点的

    @no1xsyzy 我的 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.

    正在搜索解决方案
    no1xsyzy
        21
    no1xsyzy  
       2020-06-24 20:21:13 +08:00   1
    请检查你的 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
        22
    la0wei  
    OP
       2020-06-24 20:53:08 +08:00
    @no1xsyzy 谢谢。编码已通过下面问题解决
    export PYTHOnIOENCODING="UTF-8"$PYTHONIOENCODING
    这次 supervisor tail 不报错了,不过内容为空

    我也不是头铁硬要用 supervisor,只是好奇为何程序启动后有不同的现象。
    la0wei
        23
    la0wei  
    OP
       2020-06-24 21:19:30 +08:00
    @kuro1 @GeruzoniAnsasu @Tink @RubyJack @no1xsyzy @kiracyan @vinsec @54007 @chenqh @ruanimal @keepeye @caola
    谢谢各位,使用 systemd 已经搞定了。
    还是想知道出问题的原因,以后大家偶遇类似的问题或者解决方案,欢迎回来留言
    askfermi
        24
    askfermi  
       2020-06-24 21:30:04 +08:00   1
    除了用 supervisor 之类的,我记得还可以直接把 golang 的程序注册成系统服务: https://github.com/kardianos/service
    ttimasdf
        25
    ttimasdf  
       2020-06-24 22:56:35 +08:00   1
    好好学学 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
        26
    la0wei  
    OP
       2020-06-26 02:14:47 +08:00
    @askfermi systemd 启动也算是服务吧,只不过没有同一名称叫服务
    @keepeye docker 白天各种事情,没有及时回复,抱歉。docker 确实是大杀器,我是因为方案看的太多,想一步到位,有时太过追求完美,所以 dockerfile 写的太复杂,反而忘记了解决问题的初衷,docker 确实是最优方案,我换一台 vps 测试看看
    askfermi
        27
    askfermi  
       2020-06-26 05:11:23 +08:00
    @la0wei 你这么说也没错。用这个的好处是不需要额外的第三方来管理(当然也带来了一些不足)。
    keepeye
        28
    keepeye  
       2020-06-26 16:59:21 +08:00
    @la0wei docker 学习可以,但 docker 要解决的不是你问的这个问题
    julyclyde
        29
    julyclyde  
       2020-06-28 16:02:55 +08:00
    @ttimasdf docker 也不 portable 啊 只能 x86linux
    ttimasdf
        30
    ttimasdf  
       2020-07-13 15:35:17 +08:00
    @julyclyde 这个帖子讨论的是 daemon 化运行,而 docker 带来的额外优点,也就是我前面提的“portable”的意思是,在一台 vps 和另一台 vps 之间,快速迁移部署的能力。

    在不同操作系统之间“可移植”某种意义上是个伪命题,这跟这个主题讨论的问题就不一样了,展开来讲也太长了。
    revalue
        31
    revalue  
       2020-08-24 18:35:28 +08:00   1
    @la0wei 点开 c 项目,发现了不得了的东西,收藏了
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5193 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 07:47 PVG 15:47 LAX 00:47 JFK 03:47
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86