子進程是由父進程創造出來的,那麼如果一個父程序執行完退出後,子進程不管是不是僵屍進程也直接就退出了,因為父進程死了嘛。那麼這也不會造成多大危害啊?如果大家這麼認為那可就錯了,當我們剛才用ps命令觀察進程的執行狀態時,看到某些進程的狀態欄為defunct,這就是所謂的“僵屍”進程。“僵屍”進程是一個早已死亡的進程,但在進程表(processs table)中仍占了一個位置(slot)。由於進程表的容量是有限的,所以,defunct進程不僅占用系統的內存資源,影響系統的性能,而且如果其數目太多,還會導致系統癱瘓,具體請看下面的代碼:
/***********************************無限創建子進程********************************************/
#include <sys/types.h>
#include <unistd.h>
main()
{
for (;;) /*制作一個死循環*/
fork(); /*開始創建一個子進程*/
}
/********************************************************************************************/
懂C語言的朋友會知道for(;;)是一個死循環。那麼這僅有2行代碼的程序就可以把你的linux瞬間死機,因為他的作用是無限制的在內存裡增加新的子進程,一個系統根據內存的容量會分配進程的最大限制,一旦同時運行的進程數超符合,那麼你的機器必然會死機。
我這裡分別用了2個用戶進行測試過,一個是普通權限的用戶,一個是Root用戶,測試結果是“任何用戶只要執行這個程序都會讓機器死掉”。原因就是默認的Linux系統沒有對普通用戶的使用最大進程進行限制。所以這樣對系統造成很大一個威脅,那麼我們如何避免普通用戶非法執行過多資源或進程導致系統拖死,所以我們的給除了Root的用戶做一下限制。
對普通用戶進行限制:
第1步:首先進到Linux終端用vi編輯/etc/security /limits.conf文件,在裡面加入:
* hard core 0
* hard rss 5000
* hard nproc 20
這裡的* 代表除了Root的所有用戶,(* hard core 0) 是禁止core files“core 0”,(* hard rss 5000) 是限制內存使用為5MB“rss 5000”, (* hard nproc 20 )是限制進程數為“nproc 50“。大家可以根據自己系統內存大小進行合理配置。
第2步:用vi編輯/etc/pam.d/login文件,然後加上下面這行保存退出就可以。
session required /lib/security/pam_limits.so
好了,現在我們已經對普通用戶限制了進程和內存使用極限,修改完配置以後大家可以用Root和普通用戶分別進行測試,結果當然是普通用戶執行完我們剛才做的程序不會死機了。
一個系統的安全性不取決與打不打補丁,雖然打補丁很重要,但是對系統做出相應的配置也是相當重要的。