寫一個簡單的配置文件和日誌管理(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)