除了網路通訊外,伺服器程式還必須考慮許多其他細節問題,零碎,但基本上都是模板式的。
-
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日誌及其監聽埠,日誌檔案許可權,包含哪些配置檔案。
2.syslog()
應用程式使用syslog()與守護行程rsyslogd通訊。
該函式採用可變引數(第二個引數message和第三個引數。。。)來結構化輸出。
priority:設施值 (按位異或) 日誌級別。設施值預設:LOG_USER,下麵針對預設設施值,討論日誌級別。
2.1下麵這個函式可以改變syslog的預設輸出方式,進一步結構化日誌內容
(1)ident:指定字串將被新增到日誌訊息的日期和時間之後,通常設為程式的名字。
(2)logopt:對後續syslog呼叫的行為進行配置,它可取下列值的按位異或
(3)facility: 用來修改ysyslog預設設施值
此外,日誌過濾也很重要,程式再開發階段可能需要輸出很多除錯資訊,而釋出之後,我們又要將這些除錯資訊關閉,解決這個問題的方法並不是再程式釋出之後,刪除除錯程式碼(日後可能還會用到),而是緝拿但地設定日誌掩碼,使日誌級別大於日誌掩碼的日誌被系統忽略。
2.2下麵這個函式用於設定syslog的日誌掩碼。
maskpri:指定日誌掩碼值,該函式始終回成功,它傳回呼叫行程先前的日誌掩碼值。
2.3關閉日誌功能:
02 使用者資訊
1.UID, EUID, GID, EGID
使用者資訊對於伺服器安全很重要,大多說伺服器以root啟動, 非root執行
基礎知識:
一個行程擁有兩個使用者ID, UID, EUID, EUID存在的目的是為了方便資源的訪問, 它使得執行程式的使用者擁有該程式的有效使用者許可權,比如,su用來更改賬戶資訊,但修改賬戶時su程式的所有者是root,在普通使用者執行su程式時,其有效使用者就是該程式的所有者root, 有效使用者為root的行程稱為特權行程,EGID與EUID類似,下麵演示uid, euid區別:
將生成的可執行檔案,所有者設定為root,並設定該檔案set-user-id標誌,然後執行。
從測試輸出結果看,行程的uid是啟動程式的使用者id, 而euid是root。
2.切換使用者
03 行程間關係
1.行程組:
Linux下每一個行程都屬於一個行程組,因此他們除了pid之外,還有行程組ID(PGID)。我們用如下函式獲取指定行程組PGID.
成功傳回pid, 失敗-1,設定errno。
如果pid與pgid相同,則由pid指定的行程別設定為行程組首領:如果pid為0, 表示當前行程的PGID為pgid;如果pgid為0, 則使用pid作為標的pgid。setpid函式成功時傳回0, 失敗-1, 設定errno。
一個行程只能設定自己或者其子行程的PGID。並且, 當子行程呼叫exec系列函式後,我們也不能再在父行程中對他設定PGID。
2.會話
(1)一些有關聯的行程將組成一個會話, 下麵的函式用於建立一個會話:
該函式不能由行程組的首領行程呼叫,否則將產生一個錯誤。對於非首領的行程, 呼叫該函式不僅建立新會話, 而且有如下額外效果。
呼叫行程成為會話的首領,此時該行程時新會話的唯一成員。
新建一個行程組,其PGID就是呼叫行程的PID, 呼叫行程成為該組的首領。
呼叫行程將甩開終端(如果有)
該函式成功時傳回新的行程組PGID, 失敗-1, errno。
Linux行程並未提供所謂會話ID的概念, 但Linux系統認為它等於會話首領所在的行程組的PGID,
(2)並提供瞭如下函式讀取SID
3.用ps命令檢視行程關係
執行ps命令可檢視行程,行程組和會話之間的關係。
在bash_shell 下執行ps和less命令,所以ps和less命令的父行程時bash命令,這個可以從PPID(父行程PID)一列看出。
這三條命令建立了一個會話(SID是2962)和兩個行程組(PGID:2962, 3102)bash命令的PID,PGID和SID都相同,顯然它時會話的首領, 也就是組2962的首領。ps時3102的首領,
04 系統資源限制
Linux上執行的程式都會受到資源限制的影響,比如物理裝置限制(cpu數量,記憶體數量等),系統策略限制(cup時間等),以及具體實現的限制(檔案名最大長度)Linux系統資源限制可以透過如下一對函式來讀取和設定:
getrlimit , setrlimit
rlimit 結構體定義如下:
成功傳回0, 失敗-1, 置errno
rlim_t 是一個整數型別,它描述資源級別
rlim_cur 成員指定資源的軟限制,建議性的,最好不要超越的限制,如果超越,系統可能向行程傳送訊號,並終止執行,如果當前行程CPU時間超過軟限制,系統將向行程傳送SIGXCPU訊號;當檔案尺寸超過其軟限制時,系統將向行程傳送SIZEXFSZ訊號。
rlim_max 成員指定資源的硬限制。硬限制一般是軟限制的上限,普通程式可以減小應限制,而只有以root身份執行的程式才能增加硬限制,此外我們可以使用ulimit命令修改當前shell環境下的資源限制(軟/硬)這種修改對該shell啟動的所有後續程式都有效,我們也可以透過修改配置檔案來改變系統軟限制和應限制,而這種修改時永久的。
resource引數指定資源限制型別。如下表
05 改變工作目錄和根目錄
有些伺服器程式好需要改變工作目錄和根目錄(web /var/www)
獲取當前行程工作目錄和改變行程的工作目錄的函式:
buf引數指向的記憶體用於儲存當前工作目錄的絕對路徑,size指定其大小
如果當前目錄的絕對路徑超度(+1 (‘’))超過了size,則getcwd傳回NULL,errno:ERANG。
chdir中path指向要切換到的目錄。成功0, 失敗-1 置errno。
改變行程根目錄:chroot
chroot並不改變行程的當前工作目錄,呼叫chroot之後,仍需要呼叫chdir(“/”)來將工作轉至新的工作目錄,之後原來的檔案描述符依然生效。所以可以利用早先開啟的檔案描述符來訪問呼叫chroot之後不能直接訪問的檔案(目錄).
06 伺服器程式後臺化
最後,如何在程式碼中讓一個行程以守護行程的防止執行,守護行程的編寫遵循一定的步驟,下麵一個實體。
實際上,linux提供了完成同樣功能的庫函式:
nochdir:傳0則工作目錄將被設定為”/”,否則繼續使用當前工作目錄。
noclose:傳0標準輸入輸出,標準錯誤輸出都被重定向到,dev/null,否則繼續使用原來的裝置,成功0, 失敗-1 置error。
《Linux雲端計算及運維架構師高薪實戰班》2018年07月16日即將開課中,120天衝擊Linux運維年薪30萬,改變速約~~~~
*宣告:推送內容及圖片來源於網路,部分內容會有所改動,版權歸原作者所有,如來源資訊有誤或侵犯權益,請聯絡我們刪除或授權事宜。
– END –
更多Linux好文請點選【閱讀原文】哦
↓↓↓