甲基硅油可燃吗? 四甲基氢氧化铵可燃吗
2023-07-10
很多朋友对pma通俗叫什么 什么是pman不是很了解,每日小编刚好整理了这方面的知识,今天就来带大家一探究竟。
最近,一款名为supervisord的开源软件已经在产品中使用。
https://github.com/ochinchina/supervisordsupervisord是一个进程管理软件,用golang编写,3.5K star。
我们的产品中有多个服务程序需要在后台长时间运行,所以我们使用supervisord来守护和管理这些进程。
Supervisord 非常适合嵌入式Linux 平台。
一方面,supervisord可以帮助我们在开机时在后台启动多个服务程序。另一方面,当某个服务异常退出时,supervisord还可以帮助我们重新启动服务,从而保证产品能够长期正常工作。
Supervisord的代码非常值得阅读和学习,但我们今天不研究它。
我们来研究另一个核心功能类似但代码更简单的开源软件:pman。
https://github.com/matsune/pmanpman也是一个流程管理软件,不过是用C++编写的,代码只有1420行,麻雀虽小,五脏俱全,功能完全满足我们产品的需求。
例如pman的用法:
$ cat /etc/pman.conf[pman]pidfile=/tmp/pman.pid ; pman 守护进程的pidfilelogfile=/tmp/pman.log ; pman 守护进程的logfileport=127.0.0.1:50010 ; gRPC 服务器端口目录=/tmp ;默认为当前目录[program:ls]command=/bin/ls ;程序命令stdout=/tmp/sample_stdout.log ;程序标准输出日志文件(default: /tmp/${程序名称}_stdout.log)stderr=/tmp/sample_stderr.log ;程序stderr 日志文件(default: /tmp/${程序名称}_stderr.log)autorestart=true ;如果意外退出则自动重新启动autostart=true ; start program on daemon's boot 这个配置文件指定了一个需要运行的程序:ls,并指定了它的标准输出Output,以及是否自动重启等属性。
运行结果:
$ ./pman status -c pman.conf [睡眠] 运行pid: 15283 uptime: 00:00:04$ ./pman stop sleep -c pman.conf [睡眠] 停止$ ./pman status -c pman.conf [睡眠] 停止$ ./pman start sleep -c pman.conf [sleep] RUNNING pid: 15370 uptime: 00:00:00 内部实现
pman源码总共只有1420行,非常适合我们学习进程管理工具的实现原理。
$ wc -l * 222 cmd_parser.cpp 45 cmd_parser.hpp 32 conf.cpp 47 conf.hpp 80 conf_parser.cpp 23 conf_parser.hpp 222 daemon.cpp 41 daemon.hpp 29 Defines.h 126 main.cpp 56 pid_file.cpp 15 pid_file.hpp 88 pman_client.cpp 21 pman_client.hpp 188 pman_service_impl.cpp 39 pman_service_impl.hpp 35 program.cpp 27 program.hpp 21 task.hpp 54 util.cpp 9 util.hpp 1420 总计简单浏览一下源码,掌握主体:
int main(){ [.] if (cmdParser.command()==DAEMON) { //守护进程模式,并启动服务器return runServer(confParser.pmanConf(), confParser.programConfs()); } else if ( cmdParser.command()==KILL) { return killServer(confParser.pmanConf(); } else { //客户端模式,将访问服务器return runClient(confParser.pmanConf().port(), cmdParser. command(), cmdParser.program()); }}pman本身是一个守护进程服务,当不传递status、stop、start等参数时,pman会作为守护进程运行:
int runServer(.){ //程序守护进程Daemon daemon(pmanConf, programConfs);守护进程.setup(); //创建服务器线程thread(rungRPCServer, pmanConf.port(), ref(daemon))。分离(); //启动配置文件中指定的所有程序return daemon.runLoop();} 服务器线程将创建一个RPCServer,使用Google 的gRPC 组件:
https://github.com/grpc/grpc 简单来说就是实现status/stop/start等命令以RPC客户端的形式调用pman守护进程中的函数API,这里不再详细展开。
然后看runLoop()
int Daemon:runLoop(){ //启动所有用户程序for (auto program=this-programs_.begin(); program !=this-programs_.end(); ++program) { if (program-autostart()) startProgram ( *程序); } //循环用户命令行的操作while (!abrt_status) { //取出用户命令while (!tasks_.empty()) { Task task=tasks_.front(); } //启动/停止程序} }} 上面的代码只是pman的主要逻辑,还有很多其他的功能,比如命令行参数的分析、配置文件的分析、程序的管理等,都被很好的封装了,所以我们可以看得很清楚。
总结对于嵌入式Linux产品,如果需要保持应用程序长时间运行,可以考虑部署supervisord或者pman等进程管理工具。
建议优先使用Go版本的supervisord。一方面是因为Go应用部署非常简单,只需复制一个可执行文件即可。另一方面也是因为supervisord的用户更多,更活跃,功能更齐全。
如果你开发的产品没有Go环境,性能有限,类似于路由器openwrt系统,那么可以考虑使用pman,并进行定制,以满足你最终的需求。
最后,这两个开源工具的代码可读性非常好,非常适合锻炼和提高Go/C++的编程能力。喜欢研究技术的朋友,可以看看源码,一定会有收获。
以上知识分享希望能够帮助到大家!
版权声明:本站所有作品图文均由用户自行上传分享,仅供网友学习交流。若您的权利被侵害,请联系我们
推荐阅读
2023-07-10
2023-07-10
2023-07-10
2023-07-10
2023-07-10
2023-07-10
2023-07-10
2023-07-10
2023-07-10
2023-07-10
2023-07-10
2023-07-10
2023-07-10
2023-07-10
栏目热点
甲基硅油可燃吗? 四甲基氢氧化铵可燃吗
LilyGoT手表键盘C3迷你电脑套件
索泰ZBOXEdgeCI342迷你电脑正式上市
谷歌在最新的视频预告片中展示了PixelWatch的独特设计
三星与设计师Juun.J合作推出限量版可折叠产品和配件
从2023年起Fitbit设备将需要Google帐户
TOKKCAMC2+智能WiFi独立日 夜视摄像头
三星正在与全球时尚品牌JUUN.J合作
OnePlusNordWatch的颜色选项通过泄露的渲染揭示
就在第一款Nothing手机发布之前一种新的TWS芽设计浮出水面