Linux系統日志與守護進程開發實戰指南

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"…