linux守护进程--定期向文件中插入log记录

简介: <p>        要求:<span style="font-family:'Microsoft YaHei UI','Microsoft YaHei',SimSun,'Segoe UI',Tahoma,Helvetica,sans-serif,'Microsoft YaHei',Georgia,Helvetica,Arial,sans-serif,宋体,PMingLiU,serif;

        要求:自己动手实现一个守护进程,当控制台窗口关闭时还可以在后台运行,每隔一秒钟向my.log文件中插入一条记录,记录格式如下:yyyy-mm-dd hh:mi:se 。

//makefile

.SUFFIXES: .c .o
CC=gcc
SRCS=mydaemon.c
OBJS=$(SRCS:.c=.o)
EXEC=mydaemon
all: $(OBJS)
    $(CC)  -o $(EXEC) $(OBJS) 
    @echo '-------------ok--------------'
.c.o:
    $(CC) -g  -o $@ -c $< 
clean:
    rm -f $(OBJS) 
    rm -f core*

//mydaemon.c

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <signal.h>
#include <time.h>
void writelog(const char *log)
{
    time_t tDate;
    struct tm *eventTime;
    time(&tDate);//得到系统时间
    eventTime = localtime(&tDate);//将时间格式化为struct tm结构
    int iYear = eventTime->tm_year + 1900;
    int iMon = eventTime->tm_mon + 1;
    int iDay = eventTime->tm_mday;
    int iHour = eventTime->tm_hour;
    int iMin = eventTime->tm_min;
    int iSec = eventTime->tm_sec;
    char sDate[16];
    sprintf(sDate, "%04d-%02d-%02d", iYear, iMon, iDay);
    char sTime[16];
    sprintf(sTime, "%02d:%02d:%02d", iHour, iMin, iSec);
    char s[1024];
    sprintf(s, "%s %s [%s]\n", sDate, sTime, log);//将s格式化为yyyy-mm-dd hh:mi:se [x]
    FILE *fd = fopen("my.log", "a+");//以追加的方式打开文件
    fputs(s, fd);//想log文件中写入一条数据
    fclose(fd);//关闭文件
}
void setdaemon()
{
    pid_t pid, sid;
    pid = fork();
    if (pid < 0)
    {
        printf("fork failed\n");
        exit(0);
    }
    if (pid > 0)//parent
    {
        exit(0);
    }
    if ((sid = setsid()) < 0)
    {
        printf("setsid failed\n");
        exit(0);
    }
}
int main(int arg, char *args[])
{
    setdaemon();
    char buf[100];
    int i = 0;
    while (1)
    {
        memset(buf, 0, sizeof(buf));
        sprintf(buf, "log %d", i++);
        writelog(buf);
        sleep(1);
    }
    return 0;
}

//shell

#! /bin/sh

WHOAMI=`whoami`
PID=`ps -u $WHOAMI | gerp mydaemond | awk '{print $1}'`

if (test "$1" = "") then
	echo "mydaemond [start][stop][version]"
	exit 0
fi

if ( test "$1" = "status") then
	if ( test "$PID" = "") then	
		echo "not run"
	else
		echo "is running"
	fi
	exit 0
fi	

if (test "$1" = "start") then
	if (test "$PID" = "") then
		./mydaemond
	fi	
	exit 0
fi

if (test "$1" = "stop") then
	if (test "$PID" = "") then
		kill $PID
	fi	
	exit 0
fi



相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
1天前
|
NoSQL Linux 程序员
【linux进程信号(一)】信号的概念以及产生信号的方式
【linux进程信号(一)】信号的概念以及产生信号的方式
|
1天前
|
Linux
【linux进程间通信(一)】匿名管道和命名管道
【linux进程间通信(一)】匿名管道和命名管道
|
1天前
|
Java Shell Linux
【linux进程控制(三)】进程程序替换--如何自己实现一个bash解释器?
【linux进程控制(三)】进程程序替换--如何自己实现一个bash解释器?
|
1天前
|
算法 Linux Shell
【linux进程(二)】如何创建子进程?--fork函数深度剖析
【linux进程(二)】如何创建子进程?--fork函数深度剖析
|
1天前
|
存储 Linux Shell
【linux进程(一)】深入理解进程概念--什么是进程?PCB的底层是什么?
【linux进程(一)】深入理解进程概念--什么是进程?PCB的底层是什么?
|
2天前
|
固态存储 Ubuntu Linux
Linux(29) 多线程快速解压缩|删除|监视大型文件
Linux(29) 多线程快速解压缩|删除|监视大型文件
10 1
|
2天前
|
Ubuntu Linux 数据安全/隐私保护
Linux(24) 如何在Ubuntu中操作rootfs.img文件
Linux(24) 如何在Ubuntu中操作rootfs.img文件
2 0
|
2天前
|
消息中间件 Unix Linux
Linux的学习之路:17、进程间通信(1)
Linux的学习之路:17、进程间通信(1)
17 1
|
2天前
|
存储 安全 Linux
Linux的学习之路:9、冯诺依曼与进程(1)
Linux的学习之路:9、冯诺依曼与进程(1)
17 0
|
6天前
|
运维 Oracle 关系型数据库
Oracle日志文件:数据王国的“记事本”
【4月更文挑战第19天】Oracle日志文件是数据库稳定运行的关键,记录数据变更历史,用于恢复和故障处理。它们协调并发操作,确保数据一致性和完整性。日志文件实时写入操作信息并定期刷新到磁盘,便于数据恢复。然而,日志文件需备份和归档以保证安全性,防止数据丢失。日志文件,数据王国的“记事本”,默默守护数据安全。