最近在做一个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+, tm_now->tm_mon+, 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()输出时是先输出到缓冲区,然后再从缓冲区送到屏幕上。

. 使用fflush(stdout)强制刷新。
.缓冲区已满。
.scanf()要在缓冲区里取数据时会先将缓冲区刷新。
.\n,\r进入缓冲区时。
.线程结束的时候,如果该线程里也有printf(....);
. 程序结束时。

因此,在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)的更多相关文章

  1. LogCook 一个简单实用的Android日志管理工具

    众所周知,日志的管理是软件系统很重要的一部分,千万不可忽略其重要性.完整的日志将会在系统维护中起着异常重要的作用,就好像磨刀不误砍柴工一样,日志就像对系统进行分析的工具,工具便捷了,对系统分析起来就能 ...

  2. laravel学习:php写一个简单的ioc服务管理容器

    php写一个简单的ioc服务管理容器 原创: 陈晨 CoderStory 2018-01-14 最近学习laravel框架,了解到laravel核心是一个大容器,这个容器负责几乎所有服务组件的实例化以 ...

  3. 一个简单好用的日志框架NLog

    之前我介绍过如何使用log4net来记录日志,但最近喜欢上了另一个简单好用的日志框架NLog. 关于NLog和log4net的比较这里就不多讨论了,感兴趣的朋友可以参看.NET日志工具介绍和log4n ...

  4. 利用SpringBoot+Logback手写一个简单的链路追踪

    目录 一.实现原理 二.代码实战 三.测试 最近线上排查问题时候,发现请求太多导致日志错综复杂,没办法把用户在一次或多次请求的日志关联在一起,所以就利用SpringBoot+Logback手写了一个简 ...

  5. express 写一个简单的web app

    之前写过一个简单的web app, 能够完成注册登录,展示列表,CURD 但是版本好像旧了,今天想写一个简单的API 供移动端调用 1.下载最新的node https://nodejs.org/zh- ...

  6. (原创)如何使用boost.asio写一个简单的通信程序(一)

    boost.asio相信很多人听说过,作为一个跨平台的通信库,它的性能是很出色的,然而它却谈不上好用,里面有很多地方稍不注意就会出错,要正确的用好asio还是需要花一番精力去学习和实践的,本文将通过介 ...

  7. linux设备驱动第三篇:如何写一个简单的字符设备驱动?

    在linux设备驱动第一篇:设备驱动程序简介中简单介绍了字符驱动,本篇简单介绍如何写一个简单的字符设备驱动.本篇借鉴LDD中的源码,实现一个与硬件设备无关的字符设备驱动,仅仅操作从内核中分配的一些内存 ...

  8. 用node.js从零开始去写一个简单的爬虫

    如果你不会Python语言,正好又是一个node.js小白,看完这篇文章之后,一定会觉得受益匪浅,感受到自己又新get到了一门技能,如何用node.js从零开始去写一个简单的爬虫,十分钟时间就能搞定, ...

  9. linux设备驱动第三篇:写一个简单的字符设备驱动

          在linux设备驱动第一篇:设备驱动程序简介中简单介绍了字符驱动,本篇简单介绍如何写一个简单的字符设备驱动.本篇借鉴LDD中的源码,实现一个与硬件设备无关的字符设备驱动,仅仅操作从内核中分 ...

随机推荐

  1. python 模块:csv

    转自:http://www.cnblogs.com/sislcb/archive/2008/12/15/1355481.html (感谢整理) 举几个例子来介绍一下,Python 的 CSV模块的使用 ...

  2. Hibernate学习笔记(5)---Query接口

    Hibernate中具有三种检索方式(HQL,QBC,SQL) Query接口 一个查询接口,用于向数据库中查询对象.并控制执行查询的过程.Query接口内封装了一个HQL查询语句. 举个栗子 //查 ...

  3. js 错误Error对象详解

    一.概念 error,指程序中的非正常运行状态,在其他编程语言中称为"异常"或"错误".解释器会为每个错误情形创建并抛出一个Error对象,其中包含错误的描述信 ...

  4. iOS 动画篇 之 Core Animation (一)

    iOS中实现动画有两种方式,一种是自己不断的通过drawRect:方法来绘制,另外一种就是使用核心动画(Core Animation). 导语: 核心动画提供高帧速率和流畅的动画,而不会增加CPU的负 ...

  5. Java学习笔记20---内部类之对成员内部类的补充说明(一)

    上篇文章--笔记19简要介绍了成员内部类.局部内部类和匿名内部类,下面对成员内部类再补充一些内容. 主要有以下6点: 1.成员内部类不可以有静态成员,成员变量为static final时除外 2.外部 ...

  6. TCP网络编程-----客户端请求连接服务器、向服务器发数据、从服务器接收数据、关闭连接

    SOCKET m_sockClient; unsigned short portNum; ------------------------------------------------------- ...

  7. Linux 常见目录与区别

    .   代表此层目录 ..   代表上一层目录 -   代表前一个工作目录 ~   代表『目前用户身份』所在的家目录

  8. ajax写登录页面

    静态配置 STATICFILES_DIRS = ( os.path.join(BASE_DIR,'my_blog','static'), ) AUTH_USER_MODEL = "app01 ...

  9. MySQL并发复制系列二:多线程复制 2016

    并发复制(Parallel Replication) 系列二: Enhanced Multi-threaded Slaves作者:沃趣科技MySQL数据库工程师  麻鹏飞 首先梳理下传统MySQL/M ...

  10. web页面接入QQ客服的方法

    在做微信二次开发的时候或者手机版网页的时候有人想在接qq客服,下面我就分享一下具体操作: 1,准备一个QQ号,可以是企业QQ,也可以是个人QQ.登录网址:http://shang.qq.com/wid ...