最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言實現(xiàn)日志備份守護進程的示例詳解

 更新時間:2025年04月18日 09:52:04   作者:漫談網絡  
這篇文章主要為大家詳細介紹了如何使用C語言開發(fā)一個簡單的日志備份守護進程,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下

實訓背景

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

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

環(huán)境準備

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

工具:

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

目錄創(chuàng)建:

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

實訓步驟

任務1:編寫守護進程代碼(C語言)

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

1.編寫代碼 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); // 父進程退出

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

    // 關閉標準輸入輸出
    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);

            // 模擬壓縮備份(實際可調用 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

任務2:配置為 systemd 服務

目標:將守護進程注冊為系統(tǒng)服務,實現(xiàn)開機自啟和狀態(tài)管理。

創(chuàng)建服務文件

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

編寫服務配置

[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

部署并啟動服務

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

驗證服務狀態(tài)

systemctl status backup_daemon

任務3:測試與日志查看

目標:驗證守護進程的功能和日志記錄是否正常。

生成測試日志文件

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

查看備份目錄

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

查看守護進程日志

tail -f /var/log/backup_daemon.log

任務4:調試與進程管理

目標:使用命令管理守護進程并調試問題。

查看進程信息

ps -ef | grep backup_daemon

停止服務

sudo systemctl stop backup_daemon

手動啟動調試模式

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

實訓總結

通過本案例,學員將掌握以下技能:

  • 使用 C 語言編寫守護進程的核心步驟(fork、setsid、關閉文件描述符等)。
  • 通過 systemd 將進程注冊為系統(tǒng)服務,實現(xiàn)標準化管理。
  • 日志記錄與調試方法,排查守護進程運行問題。

知識要點

守護進程特點:后臺運行、脫離終端、生命周期長。

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

systemd 服務管理:服務文件編寫、systemctl 命令使用。

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

調試技巧:ps 查看進程狀態(tài)、systemctl status 分析服務問題。

擴展思考:

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

以上就是C語言實現(xiàn)日志備份守護進程的示例詳解的詳細內容,更多關于C語言日志備份的資料請關注腳本之家其它相關文章!

相關文章

  • OpenCV實現(xiàn)高斯噪聲

    OpenCV實現(xiàn)高斯噪聲

    這篇文章主要為大家詳細介紹了OpenCV實現(xiàn)高斯噪聲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • C++ Boost Uuid超詳細講解

    C++ Boost Uuid超詳細講解

    Boost是為C++語言標準庫提供擴展的一些C++程序庫的總稱。Boost庫是一個可移植、提供源代碼的C++庫,作為標準庫的后備,是C++標準化進程的開發(fā)引擎之一,是為C++語言標準庫提供擴展的一些C++程序庫的總稱
    2022-12-12
  • VC實現(xiàn)A進程窗口嵌入到B進程窗口中顯示的方法

    VC實現(xiàn)A進程窗口嵌入到B進程窗口中顯示的方法

    這篇文章主要介紹了VC實現(xiàn)A進程窗口嵌入到B進程窗口中顯示的方法,對于理解windows程序運行原理的進程問題有一定的幫助,需要的朋友可以參考下
    2014-07-07
  • C++?Qt實現(xiàn)一個解除文件占用小工具

    C++?Qt實現(xiàn)一個解除文件占用小工具

    這篇文章主要為大家詳細介紹了如何利用C++?Qt實現(xiàn)一個解除文件占用小工具,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2023-09-09
  • 單詞小助手C語言版

    單詞小助手C語言版

    這篇文章主要為大家詳細介紹了C語言版的單詞小助手,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • C++中this指針的介紹及使用實例講解

    C++中this指針的介紹及使用實例講解

    這篇文章主要介紹了C++中this指針的介紹及使用實例講解,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2025-05-05
  • C++實操之內聯(lián)成員函數介紹

    C++實操之內聯(lián)成員函數介紹

    大家好,本篇文章主要講的是C++實操之內聯(lián)成員函數介紹,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • c++ For循環(huán)執(zhí)行順序流程圖解

    c++ For循環(huán)執(zhí)行順序流程圖解

    for 循環(huán)允許您編寫一個執(zhí)行特定次數的循環(huán)的重復控制結構,這里為大家分享一下具體的執(zhí)行流程,需要的朋友可以參考下
    2021-10-10
  • 利用C語言實現(xiàn)將格式化數據和字符串相互轉換

    利用C語言實現(xiàn)將格式化數據和字符串相互轉換

    這篇文章主要為大家詳細介紹了2個函數,分別是sprintf和sscanf,可以用來實現(xiàn)將格式化數據和字符串相互轉換,感興趣的小伙伴可以跟隨小編一起學習一下
    2023-03-03
  • C++ 雙鏈表的基本操作(詳解)

    C++ 雙鏈表的基本操作(詳解)

    下面小編就為大家?guī)硪黄狢++ 雙鏈表的基本操作(詳解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-12-12

最新評論

安仁县| 鹤壁市| 吉安市| 丹阳市| 渝北区| 军事| 勃利县| 辉县市| 云梦县| 吉木萨尔县| 河池市| 铜川市| 乌苏市| 东莞市| 都兰县| 古浪县| 清原| SHOW| 望都县| 静宁县| 桐乡市| 迁安市| 平度市| 深水埗区| 河间市| 岐山县| 岱山县| 普定县| 大姚县| 偏关县| 大余县| 江安县| 金塔县| 乾安县| 民权县| 绥德县| 靖宇县| 米易县| 南投县| 黔西县| 平塘县|