C語言實現(xiàn)日志備份守護進程的示例詳解
實訓背景
假設你是一名運維工程師,需要為公司的監(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 權(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
實訓步驟
任務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); // 重置文件權(quá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);
// 模擬壓縮備份(實際可調(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
任務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:調(diào)試與進程管理
目標:使用命令管理守護進程并調(diào)試問題。
查看進程信息
ps -ef | grep backup_daemon
停止服務
sudo systemctl stop backup_daemon
手動啟動調(diào)試模式
/usr/local/bin/backup_daemon # 觀察終端輸出(需先停止服務)
實訓總結(jié)
通過本案例,學員將掌握以下技能:
- 使用 C 語言編寫守護進程的核心步驟(fork、setsid、關閉文件描述符等)。
- 通過 systemd 將進程注冊為系統(tǒng)服務,實現(xiàn)標準化管理。
- 日志記錄與調(diào)試方法,排查守護進程運行問題。
知識要點
守護進程特點:后臺運行、脫離終端、生命周期長。
創(chuàng)建守護進程步驟:兩次 fork、setsid、關閉文件描述符、重定向 I/O。
systemd 服務管理:服務文件編寫、systemctl 命令使用。
日志管理:通過文件記錄操作日志,使用 tail 或 journalctl 查看。
調(diào)試技巧:ps 查看進程狀態(tài)、systemctl status 分析服務問題。
擴展思考:
- 如何優(yōu)化備份邏輯(如僅備份新增文件)?
- 如何通過信號(如 SIGHUP)實現(xiàn)守護進程配置熱加載?
以上就是C語言實現(xiàn)日志備份守護進程的示例詳解的詳細內(nèi)容,更多關于C語言日志備份的資料請關注腳本之家其它相關文章!
相關文章
C語言中的fscanf()函數(shù)與vfscanf()函數(shù)使用
這篇文章主要介紹了C語言中的fscanf()函數(shù)與vfscanf()函數(shù)使用,是C語言入門學習中的基礎知識,需要的朋友可以參考下2015-08-08
C++實現(xiàn)LeetCode(228.總結(jié)區(qū)間)
這篇文章主要介紹了C++實現(xiàn)LeetCode(228.總結(jié)區(qū)間),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下2021-07-07
C語言編寫基于TCP和UDP協(xié)議的Socket通信程序示例
這篇文章主要介紹了C語言編寫基于TCP和UDP協(xié)議的Socket通信程序示例,其中TCP的客戶端與服務器端采用多線程實現(xiàn),需要的朋友可以參考下2016-03-03
CMake 生成靜態(tài)庫與動態(tài)庫的方法步驟
本文主要介紹了CMake 生成靜態(tài)庫與動態(tài)庫的方法步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-06-06
VC++中HTControl控件類之CHTRichEdit富文本編輯控件實例
這篇文章主要介紹了VC++中HTControl控件類之CHTRichEdit富文本編輯控件,是一個比較實用的功能,需要的朋友可以參考下2014-08-08

