写一个简单的配置文件和日志管理(shell)
Posted bobojiang2016
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了写一个简单的配置文件和日志管理(shell)相关的知识,希望对你有一定的参考价值。
最近在做一个Linux系统方案的设计,写了一个之前升级服务程序的配置和日志管理。
共4个文件,服务端一个UpdateServer.conf配置文件和一个UpdateServer脚本,客户端一个UpdateClinet.conf配置文件和一个UpdateClient脚本。
配置文件里主要写一些路径变量,文件名变量,IP地址变量,涉及路径最好用绝对路径。配置文件用来给用户提供修改程序执行环境和相关输入信息。
而执行脚本就写具体如何实施,包括,显示时间,执行程序,重定向等。
具体笔记如下:
01. 脚本读取另一个脚本,用了两种方法:
. Update.conf #第一种 while read line;do #第二种,均可以在文件前加路径 eval "$line" done < Update.conf
读取了之后就可以直接$引用其中的变量。
02. shell中系统时间显示方法:
date "+%F %H:%M:%S"
C语言中可以用如下显示:
time_t now ; struct tm *tm_now ; time(&now) ; tm_now = localtime(&now) ; printf("\n%04d-%02d-%02d %02d:%02d:%02d\n", tm_now->tm_year+1900, tm_now->tm_mon+1, tm_now->tm_mday, tm_now->tm_hour, tm_now->tm_min, tm_now->tm_sec) ;
03. 在进行程序输出重定向的时候遇到了无法实时重定向的问题,只有程序运行结束了才会写入文件,而实际中需要持续运行的程序输出的同时记录在log文件中。
经过测试,在Linux中,c语言编译出来的程序不像shell脚本那样一行一行的执行,实时显示,而printf的输出原理是利用缓冲区输出stdout,在终端输出情况下,它是行输出模式,也就是说遇到换行符就输出,如果程序当中有while(1)或者sleep()这种,实际上会等缓冲区满了才输出,因此会出现有死循环时屏幕上没有输出的情况。
贴一个论坛上smallnat的解释:
用printf()输出时是先输出到缓冲区,然后再从缓冲区送到屏幕上。 1. 使用fflush(stdout)强制刷新。 2.缓冲区已满。 3.scanf()要在缓冲区里取数据时会先将缓冲区刷新。 4.\n,\r进入缓冲区时。 5.线程结束的时候,如果该线程里也有printf(....); 6. 程序结束时。
因此,在printf()后面跟一个fflush(stdout)是可以实现的,另外,还找到有一个方法:
改变 stdout默认buffer为无buffer,即在程序的开始加入:
setvbuf(stdout, (char *) NULL, _IOLBF, 0);
可解决。
另外,要是想在屏幕上显示输出结果的同时又重定向进文件,可以用 | tee -a log.
04. Socket编程中服务端要获取连接客户端的ip地址的方法:
accept(socket_ser,&addr,&addr_len); printf("%s\n",inet_ntoa(addr.sin_addr));
05. 交换两个不同目录中的同名文件,用mv指令可以做到:
mv bin/A Atmp mv A bin/A mv Atmp A
以上是关于写一个简单的配置文件和日志管理(shell)的主要内容,如果未能解决你的问题,请参考以下文章