手把手带你写一个 Web 框架
叶剑峰
腾讯高级工程师,前滴滴技术专家
22731 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 42 讲
特别放送 (1讲)
手把手带你写一个 Web 框架
15
15
1.0x
00:00/00:00
登录|注册

24|管理进程:如何设计完善的运行命令?

./hade app restart: 重新启动一个app服务
./hade app stop: 停止已经启动的app服务
./hade app state: 获取启动的app的信息
./hade app start: 启动一个app服务
使用daemon方式启动apps
如果进程等待了2*closeWait之后还没结束,返回错误
确认进程已经关闭
发送SIGTERM信号
使用信号对接要查询的进程发送信号来检测
理解Reborn函数的作用
使用go-daemon库的daemon.Context结构
设置优雅关闭机制
使用net/http来启动一个Web服务
存放日志的文件:app/storage/log/app.log
存储进程PID的文件:app/storage/runtime/app.pid
启动方式:挂在控制台或以守护进程daemon方式启动
启动服务的监听地址
二级命令设计
作者:轩脉刃
标题:管理进程:如何设计完善的运行命令?
地址格式为“:8080”和“localhost:8080”、“127.0.0.1:8080”、“10.11.22.33:8080”的区别
使用每秒做一次轮询的CheckProcessExist方法实现了检查机制
使用了第三方库gspt、go-daemon
完成了运行app相关的命令
验证启动、关闭、查询和重启的命令
使用环境变量ADDRESS=:8080启动服务
启动新进程
结束旧进程
清空PID文件内容
发送SIGTERM信号给进程
确认进程是否存在
从PID文件中获取进程PID
Daemon方式启动
优雅关闭机制
启动服务时需要的记录文件
参数设计
一级命令为 app
参考文章
思考题
小结
测试
重启命令
停止命令
获取进程
启动命令
运行命令的设计
管理进程:如何设计完善的运行命令?

该思维导图由 AI 生成,仅供参考

你好,我是轩脉刃。
第 13 章我们引入命令行的时候,将 Web 启动方式改成了一个命令行。但是当时只完成了一个最简单的启动 Web 服务的命令,这节课,我们要做的是完善这个 Web 服务运行命令,让 Web 服务的运行有完整的启动、停止、重启、查询的进程管理功能。
这套完整的进程管理功能,能让应用管理者非常方便地通过一套命令来统一管控一个应用,降低应用管理者的管理成本,后续也能为实现应用自动化部署到远端服务的工具提供了基础。下面我们来具体看下如何设计这套命令并且实现它吧。

运行命令的设计

首先照惯例需要设计一下运行命令,一级命令为 app,二级命令设计如下:
./hade app start 二级命令,启动一个 app 服务
./hade app state 二级命令,获取启动的 app 的信息
./hade app stop 二级命令,停止已经启动的 app 服务
./hade app restart 二级命令,重新启动一个 app 服务
这四个二级命令,有 app 服务的启动、停止、重启、查询,基本上已经把一个 app 服务启动的状态变更都包含了,能基本满足后面我们对于一个应用的管理需求。下面来讨论下每个命令的功能和设计。

启动命令

首先是 start 这个命令,写在 framework/command/app.go 中。我们先分析下参数。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文详细介绍了如何设计完善的运行命令来管理Web服务的进程。作者首先设计了四个二级命令,包括启动、查询、停止和重启Web服务的功能。在启动命令的设计中,作者详细讨论了获取参数、确认目录和文件存在、以及启动服务的逻辑。特别是针对daemon方式启动的问题,作者使用了go-daemon库来实现子进程的启动。此外,还介绍了如何使用第三方库来自定义进程名称。文章还详细讨论了获取进程PID、停止命令和重启命令的实现步骤,包括如何根据PID查询进程是否存在、发送信号关闭进程、以及确认进程已关闭后启动新进程的逻辑。整体而言,本文对于需要了解如何设计和实现进程管理功能的读者具有一定的参考价值。文章还提出了一个思考题,探讨了使用不同地址格式的区别,为读者提供了进一步思考的空间。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《手把手带你写一个 Web 框架》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(3)

  • 最新
  • 精选
  • kkxue
    使用了syscall包,windows上就没法编译了吧

    作者回复: 是的,这个是一个问题,但是其实目前docker化比较流行,对平台的依赖其实没有那么重了

    2021-11-18
  • Geek_6d3ca8
    好像"github.com/erikdubbelboer/gspt"和github.com/sevlyar/go-daemon在 m1 上跑不起来 ./hade app start --daemon=true Error: daemon: Resource temporarily unavailable Usage:
    2023-08-29归属地:英国
  • 宙斯
    为什么不把closeWait直接定义为2*closeWait值呢
    2021-11-14
    2
收起评论
显示
设置
留言
3
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部