11.21 史上最全Linux服務器程序規範

作者:且飆丶且珍惜 來源: http://blog.csdn.net/dextrad_ihacker/article/details/51930998

除了網絡通信外,服務器程序還必須考慮許多其他細節問題,零碎,但基本上都是模板式的。 ———引

  • Linux服務器程序一般以後臺形式運行。後臺程序又稱守護進程。它沒有控制終端,因而也不會意外接受用戶輸入。守護進程的父進程一般是init進程(pid=1)。
  • Linux服務器程序通常有一套日誌系統,它至少能輸出日誌到文件,有的高級服務器可以輸出日誌到專門的UDP服務器。大部分後臺進程都在/var/log下有自己的日誌目錄。
  • Linux服務器程序一般以某個專門的非root身份運行。mysqld, httpd, syslogd等後臺進程,並分別有自己的運行賬戶mysql, apache, syslog。‘
  • Linux服務器通常時可配置的。服務器程序通常處理很多命令選項,如果一次運行的選項太多,則克拉一用配置文件來管理。絕大多數服務器程序都有配置文件並存放在/etc下
  • Linux服務器程序通常在啟動時生成一個PID文件並存入/var/run目錄中,以記錄該後臺進程的PID。
  • Linux服務器程序通常需要考慮系統資源和限制,以預測自身能承受多大負荷,比如進程可用文件描述符總數和內存總量等。

01

日誌

1.Linux系統日誌:

  • Linux提供一個守護進程來處理系統日誌–syslogd, 升級版–rsyslogd。
  • rsyslogd守護進程可以接收用戶進程輸出日誌,可以接受內核日誌。
  • 用戶進程時通過調用syslog函數生成系統日誌的。
  • 該函數將日誌輸出到一個unix本地域socket類型(AF_UNIX)的文件/dev/log中,rsyslogd則監聽該文件以獲取用戶進程的輸出。
  • 內核日誌在以前的系統上時通過另一個守護進程rklogd來管理的,rsyslogd利用額外的模塊實現了相同的功能。內核日誌由printk等換樹打印至內核環狀緩存中。環狀緩存的內容直接映射到/proc/kmsg。
  • rsyslogd通過讀取該文件獲得內核日誌,默認調試信息保存在/var/log/debug,普通信息保存至/var/log/messages,內核信息:/var/log/kern.log。配置文件:/etc/rsyslog.conf,主要設置內核日誌輸入路徑,是否接受UDP日誌,及其監聽端口(默認514 /etc/services)是否接受TCP日誌及其監聽端口,日誌文件權限,包含哪些配置文件。
史上最全Linux服務器程序規範

2.syslog()

應用程序使用syslog()與守護進程rsyslogd通信。

史上最全Linux服務器程序規範

該函數採用可變參數(第二個參數message和第三個參數。。。)來結構化輸出。

priority:設施值 (按位異或) 日誌級別。設施值默認:LOG_USER,下面針對默認設施值,討論日誌級別。

史上最全Linux服務器程序規範

2.1下面這個函數可以改變syslog的默認輸出方式,進一步結構化日誌內容

史上最全Linux服務器程序規範

(1)ident:指定字符串將被添加到日誌消息的日期和時間之後,通常設為程序的名字。

(2)logopt:對後續syslog調用的行為進行配置,它可取下列值的按位異或

史上最全Linux服務器程序規範

(3)facility: 用來修改ysyslog默認設施值

此外,日誌過濾也很重要,程序再開發階段可能需要輸出很多調試信息,而發佈之後,我們又要將這些調試信息關閉,解決這個問題的方法並不是再程序發佈之後,刪除調試代碼(日後可能還會用到),而是緝拿但地設置日誌掩碼,使日誌級別大於日誌掩碼的日誌被系統忽略。

2.2下面這個函數用於設置syslog的日誌掩碼。

史上最全Linux服務器程序規範

maskpri:指定日誌掩碼值,該函數始終回成功,它返回調用進程先前的日誌掩碼值。

2.3關閉日誌功能:

史上最全Linux服務器程序規範

02

用戶信息

1.UID, EUID, GID, EGID

用戶信息對於服務器安全很重要,大多說服務器以root啟動, 非root運行

史上最全Linux服務器程序規範

基礎知識:

一個進程擁有兩個用戶ID, UID, EUID, EUID存在的目的是為了方便資源的訪問, 它使得運行程序的用戶擁有該程序的有效用戶權限,比如,su用來更改賬戶信息,但修改賬戶時su程序的所有者是root,在普通用戶運行su程序時,其有效用戶就是該程序的所有者root, 有效用戶為root的進程稱為特權進程,EGID與EUID類似,下面演示uid, euid區別:

史上最全Linux服務器程序規範

將生成的可執行文件,所有者設置為root,並設置該文件set-user-id標誌,然後運行。

測試輸出結果看,進程的uid是啟動程序的用戶id, 而euid是root。

2.切換用戶

史上最全Linux服務器程序規範

03

進程間關係

1.進程組:

Linux下每一個進程都屬於一個進程組,因此他們除了pid之外,還有進程組ID(PGID)。我們用如下函數獲取指定進程組PGID.

史上最全Linux服務器程序規範

成功返回pid, 失敗-1,設置errno。

如果pid與pgid相同,則由pid指定的進程別設置為進程組首領:如果pid為0, 表示當前進程的PGID為pgid;如果pgid為0, 則使用pid作為目標pgid。setpid函數成功時返回0, 失敗-1, 設置errno。 一個進程只能設置自己或者其子進程的PGID。並且, 當子進程調用exec系列函數後,我們也不能再在父進程中對他設置PGID。

2.會話

(1)一些有關聯的進程將組成一個會話, 下面的函數用於創建一個會話:

史上最全Linux服務器程序規範

該函數不能由進程組的首領進程調用,否則將產生一個錯誤。對於非首領的進程, 調用該函數不僅創建新會話, 而且有如下額外效果。

調用進程成為會話的首領,此時該進程時新會話的唯一成員。 新建一個進程組,其PGID就是調用進程的PID, 調用進程成為該組的首領。 調用進程將甩開終端(如果有)

該函數成功時返回新的進程組PGID, 失敗-1, errno。 Linux進程並未提供所謂會話ID的概念, 但Linux系統認為它等於會話首領所在的進程組的PGID, (2)並提供瞭如下函數讀取SID

史上最全Linux服務器程序規範

3.用ps命令查看進程關係

執行ps命令可查看進程,進程組和會話之間的關係。

在bash_shell 下執行ps和less命令,所以ps和less命令的父進程時bash命令,這個可以從PPID(父進程PID)一列看出。 這三條命令創建了一個會話(SID是2962)和兩個進程組(PGID:2962, 3102)bash命令的PID,PGID和SID都相同,顯然它時會話的首領, 也就是組2962的首領。ps時3102的首領,

史上最全Linux服務器程序規範

04

系統資源限制

Linux上運行的程序都會受到資源限制的影響,比如物理設備限制(cpu數量,內存數量等),系統策略限制(cup時間等),以及具體實現的限制(文件名最大長度)Linux系統資源限制可以通過如下一對函數來讀取和設置: getrlimit , setrlimit

史上最全Linux服務器程序規範

rlimit 結構體定義如下:

史上最全Linux服務器程序規範

成功返回0, 失敗-1, 置errno

rlim_t 是一個整數類型,它描述資源級別

rlim_cur 成員指定資源的軟限制,建議性的,最好不要超越的限制,如果超越,系統可能向進程發送信號,並終止運行,如果當前進程CPU時間超過軟限制,系統將向進程發送SIGXCPU信號;當文件尺寸超過其軟限制時,系統將向進程發送SIZEXFSZ信號。

rlim_max 成員指定資源的硬限制。硬限制一般是軟限制的上限,普通程序可以減小應限制,而只有以root身份運行的程序才能增加硬限制,此外我們可以使用ulimit命令修改當前shell環境下的資源限制(軟/硬)這種修改對該shell啟動的所有後續程序都有效,我們也可以通過修改配置文件來改變系統軟限制和應限制,而這種修改時永久的。

resource參數指定資源限制類型。如下表

史上最全Linux服務器程序規範

05

改變工作目錄和根目錄

有些服務器程序好需要改變工作目錄和根目錄(web /var/www) 獲取當前進程工作目錄和改變進程的工作目錄的函數:

史上最全Linux服務器程序規範

buf參數指向的內存用於存儲當前工作目錄的絕對路徑,size指定其大小

如果當前目錄的絕對路徑超度(+1 (‘\\0’))超過了size,則getcwd返回NULL,errno:ERANG。

chdir中path指向要切換到的目錄。成功0, 失敗-1 置errno。

改變進程根目錄:chroot

史上最全Linux服務器程序規範

chroot並不改變進程的當前工作目錄,調用chroot之後,仍需要調用chdir(“/”)來將工作轉至新的工作目錄,之後原來的文件描述符依然生效。所以可以利用早先打開的文件描述符來訪問調用chroot之後不能直接訪問的文件(目錄).

06

服務器程序後臺化

最後,如何在代碼中讓一個進程以守護進程的防止運行,守護進程的編寫遵循一定的步驟,下面一個實例。

史上最全Linux服務器程序規範

實際上,linux提供了完成同樣功能的庫函數:

史上最全Linux服務器程序規範

nochdir:傳0則工作目錄將被設置為”/”,否則繼續使用當前工作目錄。 noclose:傳0標準輸入輸出,標準錯誤輸出都被重定向到,dev/null,否則繼續使用原來的設備,成功0, 失敗-1 置error。


分享到:


相關文章: