最近在做一个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. ContentResolver,ContentProvider,ContentObserver使用记录

    版权声明:本文出自汪磊的博客,转载请务必注明出处. 本篇博客只是记录一下ContentProvider的使用(这部分工作中用的比较少总是忘记),没有太深入研究.已经熟练掌握使用方式,想深入了解内部机制 ...

  2. Python 学习教程汇总

    Python快速教程http://www.cnblogs.com/vamei/archive/2012/09/13/2682778.html简明Python教程https://bop.molun.ne ...

  3. python 模块:xlrd && xlwt

    主要来自:http://www.jb51.net/article/60510.htm python读excel--xlrd 这个过程有几个比较麻烦的问题,比如读取日期.读合并单元格内容.下面先看看基本 ...

  4. OLAP与数据仓库------《Designing Data-Intensive Applications》读书笔记4

    由于第三章的内容比较多,这里我们拆分成两篇读书笔记来记录.上一章我们聊了聊如何数据库是如何实现存储和检索的,今天这篇我们继续来看看OLTP与OLAP存储引擎的区别与联系. 1.OLTP与OLAP 联机 ...

  5. ul li自适应居中导航

    <BODY> <div class="box"> <ul class="nav"> <li>邮箱管理</l ...

  6. ERP中自定义报表制作流程

    查询制作流程 新增单表查询--查询语句设置--表格设置(列信息)--参数设置--关联设置--着色设置 报表设计需求(以差旅报销单为例) 1.制作按部门统计每个月的 报销金额并且可以关联到明细进行比对 ...

  7. 表单验证插件--formvalidation

    表单验证是一个非常基础的功能,当你的表单项少的时候,可以自己写验证,但是当你的表单有很多的时候,就需要一些验证的插件.今天介绍一款很好用的表单验证插件,formvalidation.其前身叫做boot ...

  8. 【高精度乘法】NOIP2003麦森数

    题目描述 形如2^{P}-12P−1的素数称为麦森数,这时PP一定也是个素数.但反过来不一定,即如果PP是个素数,2^{P}-12P−1不一定也是素数.到1998年底,人们已找到了37个麦森数.最大的 ...

  9. python爬虫下载文件

    python爬虫下载文件 下载东西和访问网页差不多,这里以下载我以前做的一个安卓小游戏为例 地址为:http://hjwachhy.site/game/only_v1.1.1.apk 首先下载到内存 ...

  10. 知乎上看到的关于类.class,对象.getClass

    public class TestDemo { //测试 @Test public void fun01() { TestDemo q=new TestDemo(); A a = new A(); q ...