dmesg打印信息如何后台保存到文件中

本文介绍了一个脚本,用于实时收集Linux系统的dmesg调试信息,并将其保存到指定的日志文件中。脚本通过每隔120秒调用klogctl函数来获取最新信息,并追加到文件末尾。此过程确保系统异常退出或重启时,仍能保留重要的调试数据。

         dmesg调试i信息常常作为判断系统异常退出的重要信息,但是当个系统异常退出或重启时,信息又难以保存下来,于是才有了将dmesg调试信息保存到文件中的想法:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
//#include <linux/autoconf.h>//内核编译的配置信息
#include <sys/klog.h>
#include <sys/stat.h>
//#define __LOG_BUF_LEN   (1 << CONFIG_LOG_BUF_SHIFT)//在2.6.28内核中为默认1<<17,这才是真正dmesg buffer的大小,网上其他都扯淡。
#define __LOG_BUF_LEN   (1 << 17)//在2.6.28内核中为默认1<<17,这才是真正dmesg buffer的大小,网上其他都扯淡。
#define __LOG_PATH      "/home/default/dmesg.log"
#define LOG_SLEEP(x)    (sleep(x))
#define __LOG_SIZE      10485760//大于10M时删除文件
#define BUF_SIZE        256


long check_log_size(void)
{
	struct stat f_stat;
	if( stat( __LOG_PATH, &f_stat ) == -1 )
	{
		return -1;
	}
	return (long)f_stat.st_size;
}

int main(int argc, char *argv[])
{
	char buf[__LOG_BUF_LEN]={0,};
	char tmpbuf[BUF_SIZE]={0,};
	int ret = 0;
	FILE *fp =NULL;
	struct tm *ptr;
	time_t lt;
	//daemon(0,0);//进入守护模式
	while(1)
	{
		LOG_SLEEP(120);//sleep 10 秒
		fp = fopen(__LOG_PATH,"a+");//追加打开
		if(NULL == fp)
		{
			printf("creat file faild !\n");
			continue;
		}
		ret = klogctl(4,buf,__LOG_BUF_LEN);//获得dmesg信息,该函数需要超级用户权限运行
		if(0 >= ret){
			perror("klogctl ");
			fclose(fp);
			continue;
		}
		lt = time(NULL);//获得时间
		ptr = (struct tm *)localtime(<);
		sprintf(tmpbuf,"       [LOG TIME:]       %s",asctime(ptr));//记录时间
		printf("tmpbuf = %s\n",tmpbuf);
		fwrite(tmpbuf,strlen(tmpbuf),1,fp);
		fwrite(buf,strlen(buf),1,fp);
		fflush(fp);
		fclose(fp);
		if(__LOG_SIZE < check_log_size())
		{
			unlink(__LOG_PATH);//删除该文件
		}
		memset(tmpbuf,0,BUF_SIZE);
		memset(buf,0,__LOG_BUF_LEN);
	}
	return 0;
}

以下是Makefil

CC := arm-none-linux-gnueabi-gcc
all:dmesg_test

dmesg_test:dmesg_test.c
	$(CC) dmesg_test.c -o dmesg_test -Wall

install:
	cp dmesg_test /nfsroot/update

clean:
	rm dmesg_test

运行:dmesg_test &

程序就进入后台执行了,每隔120秒会读取一次dmesg信息。

如何在linux系统里用指令完成以下实验任务1.创建一个名为guest的用户,赋予其sudo权限,并切换到guest用户,下面的所有操作均以guest用户身份操作。2.使用dd命令创建一个名为image.dd的镜像文件,大小为3MB3.使用fdisk命令对image.dd文件进行分区,共分成3个区,每个区约1MB,第一、二分区为fat格式,第三分区为ext4格式。4.使用losetup命令将image.dd文件关联到一个循环设备上。5.使用mkfs命令对三个分区根据其格式进行相应的格式化6.创建一个名为mountpoint的目录,并将image.dd文件的分区1挂载到该目 录中,使用umask选项,将目录的读写权限设置为所有人可读、可写、可执行7.使用lsblk命令查看当前系统的磁盘信息,观查磁盘映像文件的信息8.在mountpoint目录中创建一个名为experiment的目录9.使用ifconfig命令查看系统的网络接口信息,并将输出结果重定向到名为file1.txt的新文件中。10.使用dmesg命令查看系统内核信息,并将输出结果重定向到名为file2.txt的新文件中11.使用cat命令查看file1.txt文件的内容,并将其输出保存到名为file3.txt的新文件中。12.使用sed命令将file1.txt文件中的字符串LOOPBACK替换为本人姓名的拼音,并将结果保存到一个名为file4.txt的新文件中。13.在终端中运行一个无限循环,每隔2秒钟打印一行信息”helloworld”输出添加到file2.txt尾部(不删除原内容),并放在后台运行(注意观察屏幕的输出)14.使用ps命令(不使用任何参数)查找前述无限循环进程的进程号,使用kill命令结束这个进程15.使用grep命令在file2.txt文件中查找包含字符串hello的行,并将结果输出到屏幕上。16.使用head命令显示file1.txt文件的前三行。17.使用tail命令显示file2.txt文件的最后五行。18.使用ls命令查看file1.txt文件的访问时间,再touch命令修改file1.txt文件的访问时间,改完之后再用ls命令查看file1.txt文件的访问时间,比较前后 的差别。19.使用chmod命令将file1.txt文件的权限修改为rw-r--r--。20.将image.dd文件的分区2挂载到mountpoint目录下面的mountpoint2,设置uid和gid分别为当前用户及当前用户组21.在mountpoint2目录中创建一个experiment2目录22.将file1.txt文件移动到experiment2目录23.将image.dd文件的分区3挂载到mountpoint目录下面的mountpoint3,不使用任何额外参数24.用ls命令查看mountpoint目录的内容,并比较mountpoint、mountpoint2和mountpoint3三个目录的所有者及目录读写权限的异同25.用mkdir-p命令在mountpoint3目录下创建experiment3/empty目录26.查看experiment3目录的所有者,并将该目录的所有者改成当前用户,再使用ls命令查看该目录的所有者,比较前后信息的异同27.安装一个名为tree的软件包。28.使用tree命令查看mountpoint的目录结构。29.再次使用lsblk命令查看当前系统的磁盘信息,观查磁盘映像文件的信息30.卸载mountpoint目录31.删除losetup建立的映射32.使用ls和tree命令查看mountpoint的目录内容和结构,比较umount前后信息的异同并分析。33.再次使用lsblk命令查看当前系统的磁盘信息,观查磁盘映像文件的信息,比较三次lsblk信息的异同 34.用tar命令对image.dd文件进行压缩打包,比较xz,gz,bz三种压缩格式的异同。按任务顺序一步步生成代码指令,生成时标注对应的题号
03-08
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值