大家好,欢迎来到IT知识分享网。
最开始用go语言开发后端程序的时候,总是go build,然后运行二进制文件,一般会在终端监听端口,比如”0.0.0.0:8000″。
如果本地开发的前端程序要访问api接口,或是使用Apifox测试api接口,则必须要一直开着终端。
如果要在服务端上线程序就用Docker运行。
那时我就在想,某些程序,比如Nginx、Caddy、Mysql以及Ollama之类的为什么能在“后面”偷偷运行而不必一直开着终端?
Nginx出现的时候还没有Docker,那个时候是怎么做到的?
偶尔会想起这个问题,但是终端没有去找答案。
今天又想起了这个问题,想着AI挺好用的,不如问一下吧,于是得到了下面的答案。
其实,它们不是“挂在终端里跑”,而是作为守护进程/系统服务在后台运行。
如果有需求的话,自己用go语言开发的web后端程序也能这样运行。假设开发的go程序编译后的二进制程序名为 leafsns-server。
> 当然,我从未写过守护进程相关的东西,对这个似乎也没需求,所以下面的方案是AI给的,我也没验证过是否可行,只是记录在这里。若是将来发现这些方案没问题,我会删除这段话;若是将来发现有方案有问题,我自会修改下面的内容。(最后的3和4是我正在用的,在我的印象中Nginx和MySQL都不是用这两种方式运行的。本想删除3和4,但是AI把它们一起列出来了,就留着吧。)
1. Linux(推荐)
1.1 systemd 服务:写一个unit, 随系统启动、崩溃自启、日志入 journal。
/etc/systemd/system/leafsns.service
配
ExecStart=/usr/local/bin/leafsns-server, User=xxx,WorkingDirectory=/opt/leafsns
然后
systemctl enable --now leafsns
1.2 nohub或setsid:临时后台运行
nohub ./leafsns-server > /var/log/leafsns.out 2>&1 &
1.3 screen/tmux:挂起会话,断开终端不退出。
2. Windows
2.1 注册为Windows Service
用 NSSM 或 winSW:
nssm install leafsns "C:\path\leafsns-server.exe"
或在代码中使用
golang.org/x/sys/windows/svc
实现服务接口
2.2 任务计划程序:触发器“系统启动时”,操作指向 exe,勾选“无论用户是否登录均可运行”。
3. 容器化
3.1 用Docker/Compose/K8s,容器进程即前台进程,宿主不需要开终端,重启策略保证自启。
4. 进程管理器
4.1 pm2(可管任意二进制)、supervisor等,负责守护、拉起与日志轮转。
Go 程序自身建议:
– 前台阻塞运行(不要自己 daemonize),由上层管理器托管重启和日志
– 处理优雅退出:监听 SIGTERM/SIGINT,关闭 HTTP/DB 连接
– 将日志写到文件/stdout,由 systemd/journal 或 Docker 收集
总结:把你的服务“交给系统/管理器托管”。开发机临时跑用 nohup/screen;服务器上用 systemd/Windows Service 或容器最省心。
(AI确实好用,如果自己去网上搜索,估计要很长时间才能凑出这些方案,而AI只需要几十秒就能给出这些方案。但是AI会瞎编,所以AI给出的细节不必当真,但是指出的方向值得参考。)
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/188113.html