程序和進程的區別:linux
1.程序是一種靜態資源 程序啓動產生進程shell
2.程序與進程無一一對應原則 進程是動態的一個過程編程
父進程和子進程在前面提過安全
前臺進程:執行命令時只能等待的進程爲前臺進程也叫異步進程bash
後臺進程:經過在末尾加上 & 符號,使得shell建立出子進程來執行它,須要重定向到一個文件,返回一個新建的子進程的進程號。異步
後臺進程只能針對非交互進程使用,好比find等模塊化
進程狀態 等待cpu--就緒 執行 等待交互函數
w 用戶名查看登陸用戶信息 who全部登陸的用戶信息 工具
load average 0.17 0.29 0.18 分別是過去1 5 15分鐘系統的負載程度ui
三個值的算術平均值用來定義系統的負載 <0.8爲安全狀態 被fork炸彈攻擊後就會使得負載增長
衆所周知,bash是一款極其強大的shell,提供了強大的交互與編程功能。這樣的一款shell中天然不會缺乏「函數」這個元素來幫助程序進行模塊化的高效開發與管理。因而產生了因爲其特殊的特性,bash擁有了fork炸彈。Jaromil在2002年設計了最爲精簡的一個fork炸彈的實現。
所謂fork炸彈是一種惡意程序,它的內部是一個不斷在fork進程的無限循環,fork炸彈並不須要有特別的權限便可對系統形成破壞。fork炸彈實質是一個簡單的遞歸程序。因爲程序是遞歸的,若是沒有任何限制,這會致使這個簡單的程序迅速耗盡系統裏面的全部資源。如今來看看Jaromil設計的最簡單的fork炸彈:
:() { :|:& };:
或者
.() { .|.& };.
一行看似沒法理解的只有13個字符的命令,便可佔用掉全部系統的資源。其實,這行命令若是這樣寫成bash script就不難理解了:
:()
{
:|: &
}
;
:
* 第 1 行說明下面要定義一個函數,函數名爲小數點,沒有可選參數。
* 第 2 行表示函數體開始。
* 第 3 行是函數體真正要作的事情,首先它遞歸調用本函數,而後利用管道調用一個新進程(它要作的事情也是遞歸調用本函數),並將其放到後臺執行。
* 第 4 行表示函數體結束。
* 第 5 行並不會執行什麼操做,在命令行中用來分隔兩個命令用。從整體來看,它代表這段程序包含兩個部分,首先定義了一個函數,而後調用這個函數。
* 第 6 行表示調用本函數。
冒號」:」實際上是函數名,這個bash腳本就是在不斷的執行該函數,而後不斷fork出新的進程。
對於函數名,你們可能會有所疑惑,小數點也能作函數名使用嗎?畢竟小數點是 shell 的一個內嵌命令,用來在當前 shell 環境中讀取指定 文件,並運行其中的命令。實際上的確能夠,這取決於bash對命令的解釋順序。
默認狀況下,bash處於非POSIX模式,此時對命令的解釋順序以下:
* 關鍵字,例如 if、for 等。
* 別名。別名不能與關鍵字相同,可是能夠爲關鍵字定義別名,例如 end=fi。
* 特 殊內嵌命令,例如 break、continue 等。POSIX 定義的特殊內嵌命令包括:.(小數點)、:(冒號)、break、continue、 eval、exec、exit、export、readonly、 return、set、shift、times、trap 和 unset。 bash 又增長了一個特殊的內嵌命令 source。
* 函數。若是處於非 POSIX 模式,bash 會優先匹配函數,而後再匹配內嵌命令。
* 非特殊內嵌命令,例如 cd、test 等。
* 腳本和可執行程序。在 PATH 環境變量指定的目錄中進行搜索,返回第一個匹配項。
由 於默認狀況下,bash 處於非 POSIX 模式,所以fork炸彈中的小數點會優先當成一個函數進行匹配。(注:使用小數點代替其中的冒號,也能起到徹底相同的效果。)
要使用POSIX模式來運行bash腳本,可使用如下三種方法:
* 使用 –posix 選項啓動 bash。
* 在運行bash以後,執行 set -o posix 命令。
* 使用 /bin/sh 。
那麼,有沒有辦法扼制這種狀況的發生呢?答案是確定的,只需設置進程的limit數便可。
[root@localhost ~]# ulimit -u 128
[root@localhost ~]# ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
max nice (-e) 20
file size (blocks, -f) unlimited
pending signals (-i) unlimited
max locked memory (kbytes, -l) unlimited
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) unlimited
max rt priority (-r) unlimited
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 128
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
[root@localhost ~]# .() { .|.& } ; .
[1] 6152
[root@localhost ~]# bash: fork: Resource temporarily unavailable
bash: fork: Resource temporarily unavailable
bash: fork: Resource temporarily unavailable
…
在上面的例子中,咱們將用戶能夠建立的最大進程數限制爲 128,執行fork炸彈會迅速fork出大量進程,此後會因爲資源不足而沒法繼續執行。使用工具ulimit便可設置各類限制數,具體的請參考該工具的man或help。
fork 炸彈讓咱們認識到了遞歸函數的強大功能,同時也意識到一旦使用不當,遞歸函數所形成的破壞將是巨大的。實際上,fork 炸彈只是一個很是簡單的遞歸函數,它並不涉及參數傳遞、返回值等問題,而這些問題在使用bash編程時是否有完善的支持呢?在bash中編寫遞歸函數時應該注意相關問題。
FROM IDLE用戶閒置時間
ps:進程查看命令
a:顯示全部用戶進程
u:顯示用戶名和啓動時間
x:設有終端的進程
e:全部進程
l:詳情寬屏
tty:啓動終端
stat:當前狀態
s:休眠態 d:不可終端的休眠態 R:執行態
z:僵死狀態 t:中止態 NI:進程佔總cpu書劍 Time 啓動佔總CPU時間 cmd:命令名 user:用戶名 %cpu 佔cpu時間 /總時間 %men :佔內存與系統總量百分比
ps –aux –sort pid 接執行時的PID UID 排序
pstree | more 進程樹
kill 關閉進程
-9 強制關閉 –1 進程號 xkill 關閉圖形化程序 kill all 結束全部進程
pkill 進程名
可關閉父進程 來結束一堆子進程 kill -l看信號
ls /proc 虛擬文件系統,數據存儲於內存中,動態調整
cat /proc/cpuinfo cpu信息
pgrep:進程名 返回全部進程pid
pkill :服務名 關閉該服務全部進程
nice 指定程序優先級
nice -n commond
nice –5 myprogram
renice n pid
renice –5 777
優先級取值範圍(-20 19)
nohup program & 退出後依舊執行
nohup find / -name init* > /root/find.init.20160714
ctrl+z掛起 ctrl+c終止 fg恢復到前臺 bg 恢復到後臺
jobs 查看被暫停的或者後臺的命令
linux特有命令
top
d刷新時間 u用戶 k終止 c命令 r 重設優先級