亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C語(yǔ)言實(shí)現(xiàn)日志備份守護(hù)進(jìn)程的示例詳解

 更新時(shí)間:2025年04月18日 09:52:04   作者:漫談網(wǎng)絡(luò)  
這篇文章主要為大家詳細(xì)介紹了如何使用C語(yǔ)言開(kāi)發(fā)一個(gè)簡(jiǎn)單的日志備份守護(hù)進(jìn)程,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

實(shí)訓(xùn)背景

假設(shè)你是一名運(yùn)維工程師,需要為公司的監(jiān)控系統(tǒng)開(kāi)發(fā)一個(gè)簡(jiǎn)單的日志備份守護(hù)進(jìn)程。該進(jìn)程需滿(mǎn)足以下需求:

  • 后臺(tái)運(yùn)行:脫離終端,長(zhǎng)期監(jiān)控指定目錄(如 /var/log/app/)中的日志文件。
  • 自動(dòng)備份:每隔 5 分鐘將新增的日志文件壓縮備份到 /backup/logs/ 目錄。
  • 日志記錄:記錄守護(hù)進(jìn)程自身的操作日志到 /var/log/backup_daemon.log。
  • 系統(tǒng)服務(wù)化:通過(guò) systemd 管理進(jìn)程的啟動(dòng)、停止和狀態(tài)查看。

環(huán)境準(zhǔn)備

操作系統(tǒng):Ubuntu 22.04 或 CentOS 8(需 root 權(quán)限)

工具:

  • 安裝 GCC 編譯器:sudo apt install gcc(Ubuntu)或 sudo dnf install gcc(CentOS)
  • 文本編輯器(如 vim 或 nano)

目錄創(chuàng)建:

sudo mkdir -p /var/log/app /backup/logs

實(shí)訓(xùn)步驟

任務(wù)1:編寫(xiě)守護(hù)進(jìn)程代碼(C語(yǔ)言)

目標(biāo):創(chuàng)建一個(gè)脫離終端的守護(hù)進(jìn)程,監(jiān)控目錄并備份文件。

1.編寫(xiě)代碼 backup_daemon.c

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <time.h>
#include <dirent.h>
#include <string.h>

void daemonize() {
    pid_t pid = fork();
    if (pid < 0) exit(EXIT_FAILURE);
    if (pid > 0) exit(EXIT_SUCCESS); // 父進(jìn)程退出

    setsid();                        // 創(chuàng)建新會(huì)話(huà)
    chdir("/");                      // 切換工作目錄
    umask(0);                        // 重置文件權(quán)限掩碼

    // 關(guān)閉標(biāo)準(zhǔn)輸入輸出
    close(STDIN_FILENO);
    close(STDOUT_FILENO);
    close(STDERR_FILENO);
}

void log_message(const char *message) {
    int fd = open("/var/log/backup_daemon.log", O_WRONLY | O_CREAT | O_APPEND, 0644);
    if (fd != -1) {
        time_t now = time(NULL);
        char buf[256];
        strftime(buf, sizeof(buf), "[%Y-%m-%d %H:%M:%S] ", localtime(&now));
        write(fd, buf, strlen(buf));
        write(fd, message, strlen(message));
        write(fd, "\n", 1);
        close(fd);
    }
}

void backup_logs() {
    DIR *dir = opendir("/var/log/app");
    if (!dir) {
        log_message("Failed to open log directory!");
        return;
    }

    struct dirent *entry;
    while ((entry = readdir(dir)) != NULL) {
        if (entry->d_type == DT_REG) { // 普通文件
            char src_path[256], dest_path[256];
            snprintf(src_path, sizeof(src_path), "/var/log/app/%s", entry->d_name);
            snprintf(dest_path, sizeof(dest_path), "/backup/logs/%s.tar.gz", entry->d_name);

            // 模擬壓縮備份(實(shí)際可調(diào)用 tar 命令)
            log_message("Backing up a log file...");
            char cmd[512];
            snprintf(cmd, sizeof(cmd), "tar -czf %s %s > /dev/null 2>&1", dest_path, src_path);
            system(cmd);
        }
    }
    closedir(dir);
}

int main() {
    daemonize();
    log_message("Daemon started successfully.");

    while (1) {
        backup_logs();
        sleep(300); // 每隔5分鐘執(zhí)行一次
    }
    return 0;
}

2.編譯代碼

gcc backup_daemon.c -o backup_daemon

任務(wù)2:配置為 systemd 服務(wù)

目標(biāo):將守護(hù)進(jìn)程注冊(cè)為系統(tǒng)服務(wù),實(shí)現(xiàn)開(kāi)機(jī)自啟和狀態(tài)管理。

創(chuàng)建服務(wù)文件

sudo vim /etc/systemd/system/backup_daemon.service

編寫(xiě)服務(wù)配置

[Unit]
Description=Log Backup Daemon
After=network.target

[Service]
Type=simple
ExecStart=/usr/local/bin/backup_daemon
Restart=on-failure
RestartSec=5s

[Install]
WantedBy=multi-user.target

部署并啟動(dòng)服務(wù)

sudo cp backup_daemon /usr/local/bin/
sudo systemctl daemon-reload
sudo systemctl start backup_daemon
sudo systemctl enable backup_daemon

驗(yàn)證服務(wù)狀態(tài)

systemctl status backup_daemon

任務(wù)3:測(cè)試與日志查看

目標(biāo):驗(yàn)證守護(hù)進(jìn)程的功能和日志記錄是否正常。

生成測(cè)試日志文件

sudo touch /var/log/app/test.log

查看備份目錄

ls /backup/logs  # 5分鐘后應(yīng)出現(xiàn) test.log.tar.gz

查看守護(hù)進(jìn)程日志

tail -f /var/log/backup_daemon.log

任務(wù)4:調(diào)試與進(jìn)程管理

目標(biāo):使用命令管理守護(hù)進(jìn)程并調(diào)試問(wèn)題。

查看進(jìn)程信息

ps -ef | grep backup_daemon

停止服務(wù)

sudo systemctl stop backup_daemon

手動(dòng)啟動(dòng)調(diào)試模式

/usr/local/bin/backup_daemon  # 觀察終端輸出(需先停止服務(wù))

實(shí)訓(xùn)總結(jié)

通過(guò)本案例,學(xué)員將掌握以下技能:

  • 使用 C 語(yǔ)言編寫(xiě)守護(hù)進(jìn)程的核心步驟(fork、setsid、關(guān)閉文件描述符等)。
  • 通過(guò) systemd 將進(jìn)程注冊(cè)為系統(tǒng)服務(wù),實(shí)現(xiàn)標(biāo)準(zhǔn)化管理。
  • 日志記錄與調(diào)試方法,排查守護(hù)進(jìn)程運(yùn)行問(wèn)題。

知識(shí)要點(diǎn)

守護(hù)進(jìn)程特點(diǎn):后臺(tái)運(yùn)行、脫離終端、生命周期長(zhǎng)。

創(chuàng)建守護(hù)進(jìn)程步驟:兩次 fork、setsid、關(guān)閉文件描述符、重定向 I/O。

systemd 服務(wù)管理:服務(wù)文件編寫(xiě)、systemctl 命令使用。

日志管理:通過(guò)文件記錄操作日志,使用 tail 或 journalctl 查看。

調(diào)試技巧:ps 查看進(jìn)程狀態(tài)、systemctl status 分析服務(wù)問(wèn)題。

擴(kuò)展思考:

  • 如何優(yōu)化備份邏輯(如僅備份新增文件)?
  • 如何通過(guò)信號(hào)(如 SIGHUP)實(shí)現(xiàn)守護(hù)進(jìn)程配置熱加載?

以上就是C語(yǔ)言實(shí)現(xiàn)日志備份守護(hù)進(jìn)程的示例詳解的詳細(xì)內(nèi)容,更多關(guān)于C語(yǔ)言日志備份的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C語(yǔ)言中讀取時(shí)間日期的基本方法

    C語(yǔ)言中讀取時(shí)間日期的基本方法

    這篇文章主要介紹了C語(yǔ)言中讀取時(shí)間日期的基本方法,分別是time()函數(shù)和gmtime()函數(shù)的使用,注意返回值的區(qū)別,需要的朋友可以參考下
    2015-08-08
  • C++超詳細(xì)講解稀疏矩陣

    C++超詳細(xì)講解稀疏矩陣

    今天小編就為大家分享一篇關(guān)于C++稀疏矩陣的轉(zhuǎn)置思路并實(shí)現(xiàn)乘法,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2022-05-05
  • C語(yǔ)言中常見(jiàn)的幾種流程控制語(yǔ)句

    C語(yǔ)言中常見(jiàn)的幾種流程控制語(yǔ)句

    這篇文章主要給大家介紹了關(guān)于C語(yǔ)言中常見(jiàn)的幾種流程控制語(yǔ)句,分別包括goto語(yǔ)句、if語(yǔ)句、switch語(yǔ)句、while循環(huán)、do...while循環(huán)、for循環(huán)以及break和continue等,需要的朋友可以參考下
    2021-08-08
  • C語(yǔ)言中的fscanf()函數(shù)與vfscanf()函數(shù)使用

    C語(yǔ)言中的fscanf()函數(shù)與vfscanf()函數(shù)使用

    這篇文章主要介紹了C語(yǔ)言中的fscanf()函數(shù)與vfscanf()函數(shù)使用,是C語(yǔ)言入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-08-08
  • C++實(shí)現(xiàn)LeetCode(228.總結(jié)區(qū)間)

    C++實(shí)現(xiàn)LeetCode(228.總結(jié)區(qū)間)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(228.總結(jié)區(qū)間),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • 基于Qt實(shí)現(xiàn)SVG圖片瀏覽器

    基于Qt實(shí)現(xiàn)SVG圖片瀏覽器

    SVG的英文全稱(chēng)是Scalable Vector Graphics,即可縮放的矢量圖形。本文將用Qt6制作一個(gè)簡(jiǎn)單的SVG圖片瀏覽器,感興趣的可以嘗試一下
    2022-06-06
  • C語(yǔ)言編寫(xiě)基于TCP和UDP協(xié)議的Socket通信程序示例

    C語(yǔ)言編寫(xiě)基于TCP和UDP協(xié)議的Socket通信程序示例

    這篇文章主要介紹了C語(yǔ)言編寫(xiě)基于TCP和UDP協(xié)議的Socket通信程序示例,其中TCP的客戶(hù)端與服務(wù)器端采用多線程實(shí)現(xiàn),需要的朋友可以參考下
    2016-03-03
  • CMake 生成靜態(tài)庫(kù)與動(dòng)態(tài)庫(kù)的方法步驟

    CMake 生成靜態(tài)庫(kù)與動(dòng)態(tài)庫(kù)的方法步驟

    本文主要介紹了CMake 生成靜態(tài)庫(kù)與動(dòng)態(tài)庫(kù)的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • VC++中HTControl控件類(lèi)之CHTRichEdit富文本編輯控件實(shí)例

    VC++中HTControl控件類(lèi)之CHTRichEdit富文本編輯控件實(shí)例

    這篇文章主要介紹了VC++中HTControl控件類(lèi)之CHTRichEdit富文本編輯控件,是一個(gè)比較實(shí)用的功能,需要的朋友可以參考下
    2014-08-08
  • 詳解c++良好的編程習(xí)慣與編程要點(diǎn)

    詳解c++良好的編程習(xí)慣與編程要點(diǎn)

    c++語(yǔ)言的靈活是建立在對(duì)編程者個(gè)人的編程素質(zhì)的嚴(yán)格要求基礎(chǔ)上的,好的C++編程習(xí)慣能避免很多問(wèn)題。沒(méi)有好的編程習(xí)慣,極有可能編寫(xiě)一行代碼,編譯器能報(bào)十幾個(gè)錯(cuò)誤,而且就算編譯通過(guò)了,將來(lái)在運(yùn)行過(guò)程中也會(huì)有很多莫名奇妙的問(wèn)題
    2021-06-06

最新評(píng)論