1. 程式人生 > >寫一個簡單的配置文件和日誌管理(shell)

寫一個簡單的配置文件和日誌管理(shell)

客戶端 數據 時間 r+ socket編程 har stdout scan 語言

最近在做一個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)