博文結(jié)構(gòu)
什么是程序
工作管理
程序管理目前創(chuàng)新互聯(lián)已為上千多家的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)站空間、綿陽服務(wù)器托管、企業(yè)網(wǎng)站設(shè)計(jì)、掇刀網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。
1.在 Linux 系統(tǒng)當(dāng)中: “ 觸發(fā)任何一個(gè)事件時(shí),系統(tǒng)都會(huì)將他定義成為一個(gè)程序,并且給予這個(gè)程序一個(gè) ID ,稱為 PID ,同時(shí)依據(jù)啟發(fā)這個(gè)程序的使用者與相關(guān)屬性關(guān)系,給予這個(gè) PID 一組有效的權(quán)限設(shè)置。
2.程序與進(jìn)程 ( process & program )
執(zhí)行一個(gè)程序或指令 ” 就可以觸發(fā)一個(gè)事件而取得一個(gè) PID 啰!我們說過,系統(tǒng)應(yīng)該是僅認(rèn)識(shí) binary file 的,那么當(dāng)我們要讓系統(tǒng)工作的時(shí)候,當(dāng)然就是需要啟動(dòng)一個(gè) binary file ,那個(gè) binary file 就是程序 ( program )
如上圖所示,程序一般是放置在實(shí)體磁盤中,然后通過使用者的執(zhí)行來觸發(fā)。觸發(fā)后會(huì)載入到內(nèi)存中成為一個(gè)個(gè)體,那就是程序。 為了操作系統(tǒng)可管理這個(gè)程序,因此程序有給予執(zhí)行者的權(quán)限 / 屬性等參數(shù),并包括程序所需要的指令碼與數(shù)據(jù)或文件數(shù)據(jù)等, 最后再給予一個(gè) PID 。系統(tǒng)就是通過這個(gè) PID 來判斷該 process 是否具有權(quán)限進(jìn)行工作的
程序 ( program ):通常為 binary program ,放置在儲(chǔ)存媒體中 (如硬盤、光盤、軟盤、磁帶等), 為實(shí)體文件的型態(tài)存在;
進(jìn)程 ( process ):程序被觸發(fā)后,執(zhí)行者的權(quán)限與屬性、程序的程序碼與所需數(shù)據(jù)等都會(huì)被載入內(nèi)存中, 操作系統(tǒng)并給予這個(gè)內(nèi)存內(nèi)的單元一個(gè)識(shí)別碼 ( PID ),可以說,進(jìn)程就是一個(gè)正在運(yùn)行中的程序。
子程序與父程序:程序彼此之間是有相關(guān)性的!以上面的圖示來看,連續(xù)執(zhí)行兩個(gè) bash 后,第二個(gè) bash的父程序就是前一個(gè) bash 。因?yàn)槊總€(gè)程序都有一個(gè) PID ,那某個(gè)程序的父程序該如何判斷?就通過 Parent PID( PPID )來判斷即可。
如圖:
(1 )系統(tǒng)先以 fork 的方式復(fù)制一個(gè)與父程序相同的暫存程序,這個(gè)程序與父程序唯一的差別就是 PID 不同! 但是這個(gè)暫存程序還會(huì)多一個(gè) PPID 的參數(shù),PPID 如前所述,就是父程序的程序識(shí)別碼啦!然后
( 2 )暫存程序開始以 exec 的方式載入實(shí)際要執(zhí)行的程序,以上述圖示來講,新的程序名稱為 qqq ,最終子程序的程序碼就會(huì)變成 qqq 了!
這個(gè)工作管理 ( job control ) 是用在 bash 環(huán)境下的,也就是說: “ 當(dāng)我們登陸系統(tǒng)取得 bash shell 之后,在單一終端機(jī)接口下同時(shí)進(jìn)行多個(gè)工作的行為管理 ” 。舉例來說,我們?cè)诘顷?bash 后, 想要一邊復(fù)制文件、一邊進(jìn)行數(shù)據(jù)搜尋、一邊進(jìn)行編譯,還可以一邊進(jìn)行 vim 程序撰寫! 當(dāng)然我們可以重復(fù)登陸那六個(gè)命令行的終端機(jī)環(huán)境中
這些工作所觸發(fā)的程序必須來自于你 shell 的子程序(只管理自己的 bash );
前景:你可以控制與下達(dá)指令的這個(gè)環(huán)境稱為前景的工作 ( foreground );
背景:可以自行運(yùn)行的工作,你無法使用 [ctrl]+c 終止他,可使用 bg/fg 調(diào)用該工作;
背景中 “ 執(zhí)行 ” 的程序不能等待 terminal(終端)/shell 的輸入( input )
例如:可以隱藏執(zhí)行程序
[root@localhost ~]# tar -zpcf /tmp/etc.tar.gz /etc/&
[1] 3433 \\PID
[root@localhost ~]# jobs
參數(shù)如下:
-l : 除了列出job number與指令串之外,還列出PID
-r : 僅列出正在背景run的工作
- s :僅列出正在背景當(dāng)中暫停(stop) 的工作
[root@localhost ~]# jobs -l
[1]- 3516 停止 vim aaa
[2]+ 3520 停止 vim abbb
[root@localhost ~]# fg %1
選項(xiàng)與參數(shù):
%jobnumber : jobnumber為工作號(hào)碼(數(shù)字),注意,那個(gè)%是可有可無的
舉例:執(zhí)行如下命令后,立刻丟掉背景去工作
[root@localhost ~]# find / -perm /7000 > /tmp/test.txt \\查詢過程中按下ctrl+z暫停
find: ‘/proc/3585/task/3585/fd/6’: 沒有那個(gè)文件或目錄
find: ‘/proc/3585/task/3585/fdinfo/6’: 沒有那個(gè)文件或目錄
find: ‘/proc/3585/fd/6’: 沒有那個(gè)文件或目錄
find: ‘/proc/3585/fdinfo/6’: 沒有那個(gè)文件或目錄
[3]+ 已停止 find / -perm /7000 > /tmp/test.txt
[root@localhost ~]# jobs \\查看一下
[1]- 已停止 vim aaa
[2] 已停止 vim abbb
[3]+ 已停止 find / -perm /7000 > /tmp/test.txt
[root@localhost ~]# kill -signal %jobnumber \\命令格式
[root@localhost ~]# kill -l
選項(xiàng)與參數(shù)
-l :這個(gè)是L的小寫,列出目前kill能夠使用的訊號(hào)有哪些
signal :代表給與后面接的那個(gè)工作什么樣的指示
-1 : 重新讀取一次參數(shù)的配置文件類似(reload)
-2 : 代表與由鍵盤輸入【ctrl】-c同樣的動(dòng)作
-9 : 立刻強(qiáng)制刪除一個(gè)工作
-15 : 以正常的程序方式終止一項(xiàng)工作,與-9不一樣
例如:
[root@localhost ~]# kill -9 %2
[2] 已殺死 vim abbb
[root@localhost ~]# ps aux \\觀察系統(tǒng)所有的程序數(shù)據(jù)
[root@localhost ~]# ps -lA \\也是能夠觀察所有系統(tǒng)數(shù)據(jù)
[root@localhost ~]# ps axjf \\連同部分程序樹狀態(tài)
選項(xiàng)與參數(shù):
-A :所有的process :均顯示出來,與-e具有同樣的效用;
-a :不與terminal 有關(guān)的所有process ;
-u :有效使用者( effective user)相關(guān)的process ;
-x:通常與a這個(gè)參數(shù)一起使用,可列出較完整信息。
輸出長格式規(guī)則:
1 :較長、較詳細(xì)的將該P(yáng)ID的的信息列出;
j :工作的格式( jobs format )
-f:做一個(gè)更為完整的輸出。0
[root@localhost ~]# ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 3373 3368 0 80 0 - 29191 wait pts/0 00:00:00 bash
4 T 0 3516 3373 0 80 0 - 37936 signal pts/0 00:00:00 vim
4 T 0 3585 3373 0 80 0 - 30320 signal pts/0 00:00:00 find
0 R 0 3852 3373 0 80 0 - 37233 - pts/0 00:00:00 ps
F :代表這個(gè)程序旗標(biāo) ( process flags ),說明這個(gè)程序的總結(jié)權(quán)限,常見號(hào)碼有:
若為 4 表示此程序的權(quán)限為 root ;
若為 1 則表示此子程序僅進(jìn)行復(fù)制( fork )而沒有實(shí)際執(zhí)行( exec )。
S :代表這個(gè)程序的狀態(tài) ( STAT ),主要的狀態(tài)有:
R( Running ):該程序正在運(yùn)行中;
S( Sleep ):該程序目前正在睡眠狀態(tài)( idle ),但可以被喚醒( signal )。
D:不可被喚醒的睡眠狀態(tài),通常這支程序可能在等待 I/O 的情況( ex> 打印)
T:停止?fàn)顟B(tài)( stop ),可能是在工作控制(背景暫停)或除錯(cuò) ( traced ) 狀態(tài);
Z( Zombie ):僵尸狀態(tài),程序已經(jīng)終止但卻無法被移除至內(nèi)存外。
UID/PID/PPID:代表 “ 此程序被該 UID 所擁有 / 程序的 PID 號(hào)碼 / 此程序的父程序 PID 號(hào)碼 ”
C:代表 CPU 使用率,單位為百分比;
PRI/NI: Priority/Nice 的縮寫,代表此程序被 CPU 所執(zhí)行的優(yōu)先順序,數(shù)值越小代表該程序越快被 CPU 執(zhí)行。詳細(xì)的 PRI與 NI 將在下一小節(jié)說明。
ADDR/SZ/WCHAN :都與內(nèi)存有關(guān), ADDR 是 kernel function
TTY:登陸者的終端機(jī)位置,若為遠(yuǎn)端登陸則使用動(dòng)態(tài)終端接口 ( pts/n );
TIME:使用掉的 CPU 時(shí)間,注意,是此程序?qū)嶋H花費(fèi) CPU 運(yùn)行的時(shí)間,而不是系統(tǒng)時(shí)間;
CMD:就是 command 的縮寫,造成此程序的觸發(fā)程序之指令為何
[root@localhost ~]# ps -aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.3 125288 3832 ? Ss 21:36 0:01 /usr/lib/systemd/syst
root 2 0.0 0.0 0 0 ? S 21:36 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S 21:36 0:00 [ksoftirqd/0]
root 6 0.0 0.0 0 0 ? S 21:36 0:00 [kworker/u256:0]
root 7 0.0 0.0 0 0 ? S 21:36 0:00 [migration/0]
root 8 0.0 0.0 0 0 ? S 21:36 0:00 [rcu_bh]
root 9 0.0 0.0 0 0 ? R 21:36 0:00 [rcu_sched]
............................
USER :該 process 屬于那個(gè)使用者帳號(hào)的?
PID :該 process 的程序識(shí)別碼。
%CPU :該 process 使用掉的 CPU 資源百分比;
%MEM :該 process 所占用的實(shí)體內(nèi)存百分比;
VSZ :該 process 使用掉的虛擬內(nèi)存量 ( KBytes )
RSS :該 process 占用的固定的內(nèi)存量 ( KBytes )
TTY :該 process 是在那個(gè)終端機(jī)上面運(yùn)行
STAT :該程序目前的狀態(tài),狀態(tài)顯示與 ps -l 的 S 旗標(biāo)相同 ( R/S/T/Z )
START :該 process 被觸發(fā)啟動(dòng)的時(shí)間;
TIME :該 process 實(shí)際使用 CPU 運(yùn)行的時(shí)間。
COMMAND :該程序的實(shí)際指令
[root@localhost ~]# ps -lA
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 1 0 0 80 0 - 31322 ep_pol ? 00:00:01 systemd
1 S 0 2 0 0 80 0 - 0 kthrea ? 00:00:00 kthreadd
1 S 0 3 2 0 80 0 - 0 smpboo ? 00:00:00 ksoftirqd/0
1 S 0 6 2 0 80 0 - 0 worker ? 00:00:00 kworker/u256:0
..................................
可以發(fā)現(xiàn)每個(gè)字段與ps -l 的輸出情況相同,但顯示的程序則包括系統(tǒng)所的程序有
選項(xiàng)與參數(shù):
-d :后面可以接秒數(shù),就是整個(gè)程序畫面更新的秒數(shù)。默認(rèn)是5秒;
-b :以批次的方式執(zhí)行top,還有更多的參數(shù)可以使用喔!通常會(huì)搭配數(shù)據(jù)流重響來將批次的結(jié)果輸出成為文件。
-n:與-b搭配,意義是,需要進(jìn)行幾次top的輸出結(jié)果。
p :指定某些個(gè)PID來進(jìn)行觀察監(jiān)測而已。在top執(zhí)行過程當(dāng)中可以使用的按鍵指令:
? :示在top 當(dāng)中可以輸入的按鍵指令;
P :以CPU的使用資源排序顯示;
M :以Memory的使用資源排序顯示;
N :以PID來排序
T :由該P(yáng)rocess使用的CPU時(shí)間累積(TIME+) 排序。
k :給予某個(gè)PID一個(gè)訊號(hào)( signa1)
r:給予某個(gè)PID重新制訂一個(gè)nice值。
q。開top軟件的按鍵。
[root@localhost ~]# top -d 2 \\在里面按下r,則會(huì)輸入東西
top - 22:12:54 up 35 min, 2 users, load average: 0.27, 0.20, 0.14
Tasks: 172 total, 2 running, 168 sleeping, 2 stopped, 0 zombie
%Cpu(s): 12.8 us, 2.1 sy, 0.0 ni, 85.1 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 999936 total, 76540 free, 540976 used, 382420 buff/cache
KiB Swap: 2097148 total, 2094632 free, 2516 used. 233744 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
2867 root 20 0 1484940 170296 49456 S 6.5 17.0 0:30.15 gnome-shell
1747 root 20 0 215824 26092 10428 R 4.0 2.6 0:11.07 Xorg
3368 root 20 0 574040 23780 14652 S 2.0 2.4 0:06.29 gnome-terminal-
2833 root 20 0 1094016 24516 15828 S 1.5 2.5 0:00.73 gnome-settings-
2904 root 20 0 574456 8876 5320 S 1.0 0.9 0:01.23 caribou
676 root 20 0 4368 592 496 S 0.5 0.1 0:01.79 rngd
2654 root 20 0 27644 1844 620 S 0.5 0.2 0:00.30 dbus-daemon
2821 root 20 0 201268 3428 2768 S 0.5 0.3 0:00.31 at-spi2-registr
43813 root 20 0 157708 2288 1584 R 0.5 0.2 0:00.03 top
1 root 20 0 125288 3832 2404 S 0.0 0.4 0:01.70 systemd ..........................
top主要分為兩個(gè)畫面,上面的畫面為整個(gè)系統(tǒng)的資源使用狀態(tài),基本上總共有六行,顯示的內(nèi)容依序是:
第一行( top...) :目前的時(shí)間,亦即是 10:52:16 那個(gè)項(xiàng)目;
開機(jī)到目前為止所經(jīng)過的時(shí)間,亦即是 up 1:40, 那個(gè)項(xiàng)目;
已經(jīng)登陸系統(tǒng)的使用者人數(shù),亦即是 2 users, 項(xiàng)目;
系統(tǒng)在 1, 5, 15 分鐘的平均工作負(fù)載
第二行( Tasks... ):顯示的是目前程序的總量與個(gè)別程序在什么狀態(tài)( running, sleeping, stopped, zombie )
第三行( %Cpus... ):顯示的是 CPU 的整體負(fù)載
6.7% us — 用戶空間占用CPU的百分比。
0.4% sy — 內(nèi)核空間占用CPU的百分比。
0.0% ni — 改變過優(yōu)先級(jí)的進(jìn)程占用CPU的百分比
92.9% id — 空閑CPU百分比
0.0% wa — IO等待占用CPU的百分比
0.0% hi — 硬中斷(Hardware IRQ)占用CPU的百分比
0.0% si — 軟中斷(Software Interrupts)占用CPU的百分比
0.0% st ---虛擬cpu等待實(shí)際cpu的時(shí)間百分比
第四行:內(nèi)存狀態(tài)
8306544k total — 物理內(nèi)存總量(8GB)
7775876k used — 使用中的內(nèi)存總量(7.7GB)
530668k free — 空閑內(nèi)存總量(530M)
79236k buffers — 緩存的內(nèi)存量 (79M)
第五行:swap交換分區(qū)
2031608k total — 交換區(qū)總量(2GB)
2556k used — 使用的交換區(qū)總量(2.5M)
2029052k free — 空閑交換區(qū)總量(2GB)
4231276k cached — 緩沖的交換區(qū)總量(4GB)
第六行:這個(gè)是當(dāng)在 top 程序當(dāng)中輸入指令時(shí),顯示狀態(tài)的地方。
PID :每個(gè) process 的 ID 啦!
USER :該 process 所屬的使用者;
PR : Priority 的簡寫,程序的優(yōu)先執(zhí)行順序,越小越早被執(zhí)行;
NI : Nice 的簡寫,與 Priority 有關(guān),也是越小越早被執(zhí)行;
%CPU : CPU 的使用率;
%MEM :內(nèi)存的使用率;
TIME+ : CPU 使用時(shí)間的累加;
[root@localhost ~]# top -b -n 2 > /tmp/123.txt
將top的信息進(jìn)行2次,然后將結(jié)果輸出到/tmp/123.txt文件中
[root@localhost ~]# cat /tmp/123.txt
選項(xiàng)與參數(shù):
-A :各程序樹之間的連接以ASCII 字符來連接;
-U :各程序樹之間的連接以萬國碼的字符來連接。在某些終端接口下可能會(huì)有錯(cuò)誤;
P :并同時(shí)列出每個(gè)process 的PID;
u :并同時(shí)列出每個(gè)process的所屬帳號(hào)名稱。