zoukankan      html  css  js  c++  java
  • 写一个简单的配置文件和日志管理(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("
    %04d-%02d-%02d %02d:%02d:%02d
    ",
    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.
    ,
    进入缓冲区时。
    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
    ",inet_ntoa(addr.sin_addr));
            

    05. 交换两个不同目录中的同名文件,用mv指令可以做到:

    mv bin/A Atmp
    mv A bin/A
    mv Atmp A
    种树最好的时间是十年前,其次是现在。
  • 相关阅读:
    foreach
    if
    注意事项
    Maven测试
    课程评价
    个人总结
    HTML表格CSS美化
    让多个输入框对齐
    CSS样式写在JSP代码中的几种方法
    日常
  • 原文地址:https://www.cnblogs.com/bobojiang/p/7680817.html
Copyright © 2011-2022 走看看