news 2026/5/14 22:16:16

Llinux - 项目部署:从代码到可交付服务的完整指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Llinux - 项目部署:从代码到可交付服务的完整指南

Linux守护进程(Daemon)完全指南:从原理到实战-CSDN博客


1. 回顾:守护进程做了什么?

我们之前实现的Daemon()函数,把一个普通的前台程序变成了:

  • 脱离终端setsid()+fork()使其不再受Ctrl+C、终端关闭影响

  • 重定位工作目录chdir("/")防止占用可卸载文件系统

  • 重定向标准 IO:所有输出输入都指向/dev/null,避免干扰

这样一来,我们的ServerNetcald程序就可以像一个真正的系统服务一样后台常驻。

但有了守护进程化的程序,我们还需要一套部署规范,让服务可以方便地安装、启动、停止、查看日志。


2. 部署前的准备:Makefile 解析

提供的 Makefile 非常简短,但包含了很多部署思想。我们先逐行看:

.PHONY: all all: ServerNetcald client_netcal ServerNetcald: main.cc g++ -o $@ $^ -std=c++17 -ljsoncpp client_netcal: TcpClient.cc g++ -o $@ $^ -std=c++17 -ljsoncpp
  • all是默认目标,负责编译服务器和客户端。

  • 使用-ljsoncpp链接 JSON 库,说明通信协议可能基于 JSON。

  • $@$^是自动变量,分别代表目标文件和依赖文件。

部署的精髓在下面的output目标

.PHONY: output output: @mkdir output @mkdir -p output/bin @mkdir -p output/conf @mkdir -p output/log @cp ServerNetcald output/bin @cp client_netcal output/bin @cp test.conf output/conf @tar czf output.tgz output

这个目标定义了标准的交付包结构


3. 标准化输出目录结构

执行make output后,会生成以下目录树:

为什么要这样划分?

目录用途
bin/存放可执行文件,便于加入PATH或直接运行
conf/配置文件与代码分离,修改配置无需重新编译
log/运行日志存放位置,方便轮转和监控

这种布局是 Linux 服务部署的常见惯例(类似于/usr/local/服务名下的结构)。将配置和二进制分开,也符合十二要素应用中“配置与代码分离”的原则。

最后一条命令tar czf output.tgz output将整个目录打包成output.tgz,这就是可交付的部署包


4. 打包与分发

执行:

make clean # 清理旧构建 make all # 编译程序 make output # 创建目录结构并打包

你会得到output.tgz文件。将它拷贝到目标服务器,解压后就能运行:

tar xzf output.tgz cd output

这种发布方式的好处:

  • 不依赖源码环境,只需目标机器有运行时库(如libjsoncpp

  • 目录结构固定,便于写启动脚本(如 systemd service)

  • 日志和配置外置,运行时可以动态修改


5. 如何在生产环境运行守护进程

虽然我们的ServerNetcald内部调用了Daemon(false, false)把自己变成守护进程但直接运行仍然会立即返回(因为父进程退出)。那么如何启动、停止、查看状态呢?

5.1 手动启动

cd output/bin ./ServerNetcald 8080

因为程序会自行 daemonize,执行后 shell 会立即返回(实际上控制权已经交还给终端)。你可以用ps验证:

ps aux | grep ServerNetcald

项目部署不是简单的"复制文件",而是一个从源码到系统服务的完整工程化流程

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/14 22:15:36

3.6链队列

#include<stdio.h> #include<malloc.h>//链队列的节点 typedef struct LinkNode{int data;struct LinkNode*next; }*LinkNodePtr; //链队列 typedef struct LinkQueue{LinkNodePtr front;LinkNodePtr rear; }*LinkQueuePtr; //construct an empty quene LinkQueue…

作者头像 李华
网站建设 2026/5/14 22:15:15

别再死记硬背了!用ENSP模拟器实战华为交换机VLAN配置,看完就会

实战华为ENSP模拟器&#xff1a;用可视化方法掌握VLAN配置精髓 很多网络工程师在初学阶段都经历过这样的困境&#xff1a;面对厚厚的命令手册&#xff0c;死记硬背各种VLAN配置指令&#xff0c;却在真实环境中手足无措。这种脱离实际场景的学习方式不仅效率低下&#xff0c;更难…

作者头像 李华
网站建设 2026/5/14 22:14:24

如何在macOS上运行Windows应用:Whisky让你的Mac变身Windows工作站

如何在macOS上运行Windows应用&#xff1a;Whisky让你的Mac变身Windows工作站 【免费下载链接】Whisky A modern Wine wrapper for macOS built with SwiftUI 项目地址: https://gitcode.com/gh_mirrors/wh/Whisky 你是否曾经因为某个必须使用的Windows软件而烦恼&#…

作者头像 李华
网站建设 2026/5/14 22:13:41

终极免费AMD Ryzen调试工具:5分钟掌握硬件底层控制权

终极免费AMD Ryzen调试工具&#xff1a;5分钟掌握硬件底层控制权 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https://git…

作者头像 李华
网站建设 2026/5/14 22:10:37

如何快速解决Zotero中文文献管理难题:茉莉花插件终极指南

如何快速解决Zotero中文文献管理难题&#xff1a;茉莉花插件终极指南 【免费下载链接】jasminum A Zotero add-on to retrive CNKI meta data. 一个简单的Zotero 插件&#xff0c;用于识别中文元数据 项目地址: https://gitcode.com/gh_mirrors/ja/jasminum 如果你正在使…

作者头像 李华