Linux系统日志与守护进程开发实战指南

系统日志与守护进程
├── 系统日志syslog
│   ├── 日志路径: /var/log/syslog
│   └── 核心API
│        ├── openlog
│        ├── syslog
│        └── closelog
└── 守护进程daemon└── 创建步骤├── umask(0)├── fork+父进程退出├── setsid├── chdir('/')├── 关闭文件描述符└── 重定向标准IO

一、系统日志(syslog)核心技术

1. 日志系统架构

// 典型日志写入流程
openlog("MyDaemon", LOG_PID|LOG_CONS, LOG_DAEMON);
syslog(LOG_INFO, "Service started: PID=%d", getpid());
closelog();

2. syslog核心API详解

函数参数说明示例用法
openlog()ident: 程序标识
option: 日志选项
facility: 日志类别
openlog("httpd", LOG_PID, LOG_DAEMON)
syslog()priority: 日志级别
format: 格式化字符串
syslog(LOG_ERR, "Connection failed: %s", strerror(errno))
closelog()无参数closelog()

常用选项组合

// 日志选项
LOG_PID     // 包含进程ID
LOG_CONS    // 错误时输出到控制台
LOG_NDELAY  // 立即打开连接// 日志类别
LOG_DAEMON  // 守护进程
LOG_USER    // 用户进程(默认)
LOG_LOCAL0  // 自定义类别0// 日志级别(降序)
LOG_EMERG → LOG_ALERT → LOG_CRIT → LOG_ERR 
→ LOG_WARNING → LOG_NOTICE → LOG_INFO → LOG_DEBUG

3. 日志配置文件

/etc/rsyslog.conf 关键配置:

# 守护进程日志存储规则
daemon.*      /var/log/daemon.log
# 自定义日志存储
local0.*      /var/log/myapp.log
# 所有info级别日志
*.info        /var/log/messages

日志轮转配置

# /etc/logrotate.d/mydaemon
/var/log/myapp.log {dailyrotate 30compressmissingoknotifemptysharedscriptspostrotate/usr/bin/systemctl reload rsyslog > /dev/nullendscript
}

二、守护进程开发六步法

1. 标准创建流程

#include <unistd.h>int daemon(int nochdir, int noclose);

手动创建实现

void create_daemon() {// Step 1: 清除文件掩码umask(0);// Step 2: 首次forkpid_t pid = fork();if (pid > 0) exit(EXIT_SUCCESS); // 父进程退出// Step 3: 创建新会话setsid();// Step 4: 二次fork(可选)pid = fork();if (pid > 0) exit(EXIT_SUCCESS);// Step 5: 切换工作目录chdir("/");// Step 6: 关闭文件描述符for (int fd = sysconf(_SC_OPEN_MAX); fd >= 0; fd--)close(fd);// Step 7: 重定向标准IOopen("/dev/null", O_RDWR); // stdindup(0); // stdoutdup(0); // stderr
}

2. 守护进程特征验证

# 查看进程关系
ps -efj | grep mydaemon# 预期输出特征:
# PID ≠ SID ≠ PGID
# TTY = ? (无控制终端)
# COMMAND = 守护进程名

三、实战:日志守护进程开发

1. 完整代码示例

#include <sys/stat.h>
#include <syslog.h>
#include <fcntl.h>
#include <unistd.h>int main() {// 创建守护进程if(daemon(0, 0) {perror("daemon");return 1;}// 打开日志连接openlog("MyDaemon", LOG_PID|LOG_NDELAY, LOG_DAEMON);// 主循环int counter = 0;while(1) {syslog(LOG_INFO, "Daemon running: %d cycles", ++counter);// 模拟工作sleep(5);// 错误模拟if(counter % 10 == 0) {syslog(LOG_WARNING, "Simulated warning event");}}closelog();return 0;
}

2. 系统服务配置

/etc/systemd/system/mydaemon.service:

[Unit]
Description=Custom Logging Daemon[Service]
ExecStart=/usr/sbin/mydaemon
Restart=always
RestartSec=30
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=mydaemon[Install]
WantedBy=multi-user.target

管理命令

# 启动服务
sudo systemctl start mydaemon# 查看日志
journalctl -u mydaemon -f# 设置开机启动
sudo systemctl enable mydaemon

四、高级应用场景

1. 自定义日志过滤器

// 设置日志过滤级别
setlogmask(LOG_UPTO(LOG_WARNING));// 此时以下日志将被过滤
syslog(LOG_DEBUG, "Debug message"); // 不会被记录

2. 多守护进程日志分离

// 不同服务使用不同facility
openlog("WebServer", LOG_PID, LOG_LOCAL0);
openlog("DBServer", LOG_PID, LOG_LOCAL1);

配置分离存储

# /etc/rsyslog.d/10-mydaemons.conf
local0.*    /var/log/web.log
local1.*    /var/log/db.log

五、调试与问题排查

1. 常见错误处理

错误现象解决方案
日志写入权限不足chown root:adm /var/log/*
日志文件不滚动检查logrotate配置及权限
守护进程启动失败使用strace跟踪系统调用
日志丢失检查rsyslog服务状态

2. 实时日志监控

# 跟踪特定设施日志
tail -f /var/log/syslog | grep 'mydaemon'# 使用systemd日志
journalctl -f -t "MyDaemon"# 结构化日志查询
journalctl SYSLOG_IDENTIFIER=mydaemon --since "10min ago"

最佳实践:生产环境中建议采用日志分级策略:

  • DEBUG级别:仅开发环境启用
  • INFO级别:运行状态记录
  • WARNING以上:实时告警通知

完整思维导图:系统日志与守护进程技术全景

扩展阅读

  1. Rsyslog高性能日志架构设计
  2. Systemd Journal深度解析
  3. 分布式系统中的日志收集方案

整理笔记发送CSDN 博客,并将思维导图加在博客中

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/911925.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/911925.shtml
英文地址,请注明出处:http://en.pswp.cn/news/911925.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue.js 过滤器详解

Vue.js 过滤器详解 下面我将详细讲解Vue.js中过滤器的语法和使用注意事项&#xff0c;并提供一个完整的演示页面。 过滤器基本概念 在Vue.js中&#xff0c;过滤器&#xff08;Filters&#xff09; 是用于文本格式化的功能&#xff0c;可以在双花括号插值和v-bind表达式中使用…

【iOS】iOS崩溃总结

【iOS】iOS崩溃总结 一、前言 之前写了一篇博文《【Flutter】程序报错导致的灰屏总结》&#xff0c;浏览量、收藏率和点赞量还挺高&#xff0c;还被收录了&#xff0c;就想着总结一下iOS崩溃&#xff0c;这个也是在iOS面试中经常被问到的。 在 iOS 开发过程中&#xff0c;导致…

机器学习:特征向量与数据维数概念

特征向量与数据维数概念 一、特征向量与维数的定义 特征向量与特征类别 在机器学习和数据处理中&#xff0c;每个样本通常由多个特征&#xff08;Feature&#xff09; 描述。例如&#xff0c;一张图片的特征可能包括颜色、形状、纹理等&#xff1b;一个客户的特征可能包括年龄…

开发基于Jeston Orin Nx 开发版 16G的实现

一、基本配置 1.配置参数 密码&#xff1a;yahboom Ubuntu 20.04版本、python3.8、CUDA11.4、cuDNN8.6、TensorRT8.5、Jetpack5.1.1、Opencv4.5.4版本 终端输入命令&#xff1a;sudo jtop 其中Jetpack是英伟达提供的专门供它自己的嵌入式计算机平台使用的人工智能包。 终…

【技术分享】XR技术体系浅析:VR、AR与MR的区别、联系与应用实践

XR技术体系浅析&#xff1a;VR、AR与MR的区别、联系与应用实践 作者&#xff1a;EQ 雪梨蛋花汤 本文是技术分享文档&#xff0c;浅析VR&#xff08;虚拟现实&#xff09;、AR&#xff08;增强现实&#xff09;、MR&#xff08;混合现实&#xff09;的定义、特性、技术演进路线&…

R语言入门课| 05 一文掌握R语言常见数据类型

视频教程 大家可以先做一做R语言基础小测验&#xff0c;看看自己是否需要跟我们5.5h入门R语言的课程。 先上教程视频&#xff0c;B站同步播出&#xff1a; https://www.bilibili.com/video/BV1miNVeWEkw 完整视频回放和答疑服务可见&#xff1a;5.5h入门R语言 本节课程视频…

vRDMA 发布,助力云上 VPC 内高性能通信

资料来源&#xff1a;火山引擎-开发者社区 近日&#xff0c;火山引擎基于部分云服务器实例规格邀测发布 vRDMA 特性&#xff0c;提供云上 VPC 内大规模 RDMA 加速能力&#xff0c;可兼容传统 HPC 应用、AI 应用以及传统 TCP/IP 应用&#xff0c;降低大众化场景的适配门槛&#…

Win10安装dify

一、win10虚拟化设置&#xff0c;控制面板中开启如下三个服务 二、检查确认wls服务开启 设置自动启动并启动 确认服务开启 bcdedit 是否为auto&#xff0c;如果不是&#xff0c;设置为auto bcdedit /set hypervisorlaunchtype autocpu是否为虚拟化 更新wsl wsl --update二 …

【ai学习笔记】GitLab

CI/CD&#xff08;持续集成/持续交付&#xff09;是现代软件开发中的关键实践&#xff0c;通过自动化工具可以大幅提升开发效率和软件质量。下面为你介绍CI/CD的核心概念、常用工具以及示例配置&#xff1a; 1. CI/CD 核心概念 持续集成&#xff08;CI&#xff09;&#xff1…

Solidity 从 0 到 1 |Web3 开发入门免费共学营

开启你的 Web3 开发之旅&#xff0c;从 Sonic 开始&#xff01; 想进入区块链开发的世界&#xff0c;却不知道从哪里开始&#xff1f;选择对的语言和平台&#xff0c;才能事半功倍。 Solidity 是 Web3 中最主流、最通用的智能合约开发语言&#xff0c;被广泛应用于以太坊及其…

【unitrix】 4.4 类型级整数比较系统(cmp.rs)

一、源码 这段代码实现了一个类型级别的整数比较系统&#xff0c;允许在编译时进行整数比较操作。它定义了一套类型来表示比较结果&#xff0c;并为不同类型的整数实现了比较逻辑。 use core::cmp::Ordering; use core::default::Default; use crate::sealed::Sealed; use cr…

2025年渗透测试面试题总结-2025年HW(护网面试) 14(题目+回答)

安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 1. SQL注入原理 &#x1f4a5; 2. XXE攻击&#xff08;XML外部实体注入&#xff09; &#x1f9e9; 3. SQ…

Android开发根据滑动距离标题栏进行渐变

Android开发根据滑动距离标题栏进行渐变 假设滑动控件是NestedScrollView。 先监听NestedScrollView的滑动距离&#xff1a; nslv_preview_me.setOnScrollChangeListener(object :NestedScrollView.OnScrollChangeListener{override fun onScrollChange(v: NestedScrollView…

高中成绩可视化平台开发笔记

高中成绩可视化平台&#xff08;1&#xff09; 一、项目概述 本系统是一个基于 PyQt5 和 Matplotlib 的高中成绩数据可视化分析平台&#xff0c;旨在帮助教师快速了解学生成绩分布、班级对比、学科表现等关键指标。平台支持文科与理科的数据切换&#xff0c;并提供多个维度的图…

自动化按需导入组件库的工具rust版本完成开源了

背景 当我为每个Vue项目使用ui组件库的时候&#xff0c;都会使用按需导入的方式来使用ui组件库。但是每次按需导入&#xff0c;不可避免的就需要做以下三步。我们以element plus ui组件库为例。 1. 安装依赖 第一步&#xff0c;当然是需要安装依赖。命令如下: pnpm add unp…

Linux内核中TCP分段的核心机制:tcp_fragment函数解析

引言:TCP分段的必要性 在TCP/IP协议栈中,MSS(最大分段大小) 限制了单次传输的数据量。当应用层发送的数据超过当前路径的MSS时,内核必须执行分段操作。tcp_fragment函数正是Linux内核中处理TCP分段的核心机制,它巧妙地在协议合规性、内存安全和性能效率之间取得平衡。 一…

【赵渝强老师】OceanBase OBServer节点的SQL层

OceanBase OBServer节点的SQL层将用户的SQL请求转化成对一个或多个Tablet的数据访问。SQL层会按照以下顺序经过一系列组件来处理一个SQL&#xff1a; Parser -->Resolver-->Transformer-->Optimizer-->CodeGenerator-->Executor。视频讲解如下 【赵渝强老师】O…

从“高配”到“普惠”,黑芝麻智能携手Nullmax打造辅助驾驶主流量产方案

近日&#xff0c;黑芝麻智能携手Nullmax打造的辅助驾驶主流量产方案正式发布。该方案面向8-15万元级别主流车型&#xff0c;基于单颗黑芝麻智能武当C1236跨域计算芯片&#xff0c;集成Nullmax全栈自研的软件技术架构&#xff0c;结合领先的视觉感知算法&#xff0c;打造高性能辅…

信息安全认证体系全解析:从资质证明到行业准入的实践指南

Hello&#xff01;大家好&#xff0c;小编是一名专注IT领域的资深探索家&#xff0c;大家发现了吗&#xff1f;现在刷招聘软件&#xff0c;国企安全岗必标 "CISP 优先"&#xff0c;外企招聘悄悄写着 "CISSP 加分"—— 这些带字母的证书到底是啥&#xff1f…

优雅地创建实体类——Builder 链式调用

我们来看以下的代码。改造前构造实体类用重载构造器或用 setter 对变量进行赋值&#xff0c;一旦变量变多则需要对每个变量进行 set 赋值&#xff0c;并且有可能会赋值错对象。 private static void test() {//1.构造器赋值Task task1 new Task("2023000000009439"…