程序
在Linux底下,每觸發一個事件(通常是執行一個指令或程式),系統會將他設定成一個程序並給予一個ID,稱為PID,管理者就可以藉由這個PID來管理程序。另外系統也會依照觸發程序的使用者所擁有的權限給予程序適當的權限。
父程序與子程序
當一個程序又去觸發另一個程序時,第一個程序為父程序,新觸發的程序就稱為子程序。像我們所登入系統後會得到一個bash的shell,我們可以在這個bash而執行許多指令,假設我們在這個shell執行了/usr/bin/less這個指令,這個less的PID就稱為子程序,而bash就是他的父程序。
關於子程序與父程序的關係,可以使用pstree這支指令去觀察:
pstree 參數
-p 列出各程序的PID
-u 列出各程序的所屬帳號名稱
程序的觀察
前面所介紹的pstree指令,僅能列出子程序與父程序的關係,並不會顯示出程序的相關資訊,若要或得程序的詳細資訊可以使用ps這隻程式,他提供了程序的狀態、CPU、記憶體的使用情況等等:
ps 參數
在不加任何參數直接執行 ps時,只會列出使用者個人、有連結終端機的程序,如下:
[root@localhost tmp]# ps
PID TTY TIME CMD
2591 pts/1 00:00:00 bash
30891 pts/1 00:00:00 ps
然而只列出這些是不夠的,我們可以加入ㄧ些參數得到更多的資料:
a 顯示有連接終端機的所有行程
u 顯示有效使用者相關的程序
x 顯示未連結終端機的所有程序(通常是長期運作的的伺服行程)
l 較長、詳細的格式輸出(顯示nice值)
ps 常搭配 aux這三個參數使用,執行結果如下
[root@localhost ~]# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 2112 704 ? Ss 08:02 0:01 init [5]
root 2 0.0 0.0 0 0 ? S< 08:02 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S< 08:02 0:00 [migration/0]
root 4 0.0 0.0 0 0 ? S< 08:02 0:00 [ksoftirqd/0]
root 5 0.0 0.0 0 0 ? S< 08:02 0:00 [watchdog/0]
root 6 0.0 0.0 0 0 ? S< 08:02 0:00 [events/0]
root 7 0.0 0.0 0 0 ? S< 08:02 0:00 [khelper]
user 該程序的使用者名稱
PID 該程序的PID
%CPU 使用CPU的百分比
%MEM 使用實體記憶體的百分比
VSZ 使用虛擬記憶體的大小
RSS 佔用固定的記憶體大小
TTY 運作的終端機,如果與終端機無關則顯示 ?
STAT 程序狀態,有以下幾種
R 程序執行中
S 程序睡眠中,可被喚醒
T 程序偵測或停止
Z 程序已停止,但父程序無法正常終止他
START 程序觸發時間
TIME 該程序實際使用CPU時間
COMMAND 程序指令名稱
相對於ps的靜態輸出,top提供了動態的輸出,top可以更即時的獲取程序狀態:
top 參數
-d 更新的秒數,預設是五秒更新一次
-b 通常會搭配資料流重導向來將批次的結果輸出成為檔案
-n 指定觀察的次數,常與-b搭配
-p 指定PID
在top執行時可用的快速鍵:
?:顯示可用的快速鍵
P:以CPU的使用率進行排序
M:以記憶體的使用率進行排序
N:以PID進行排序
k:給某PID傳送信號
r:重新設定某PID的nice值
top的執行畫面如下:
top - 14:51:28 up 7:05, 3 users, load average: 0.01, 0.00, 0.00
Tasks: 126 total, 2 running, 124 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.4%us, 0.6%sy, 0.0%ni, 98.6%id, 0.4%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 2075220k total, 571116k used, 1504104k free, 59064k buffers
Swap: 2031608k total, 0k used, 2031608k free, 305772k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
2381 root 20 0 143m 61m 15m R 84.2 3.0 1:59.05 nautilus
2088 root 20 0 49148 19m 6016 S 3.9 1.0 0:38.33 Xorg
3372 root 20 0 2360 964 724 R 2.0 0.0 0:00.01 top
1 root 20 0 1948 768 560 S 0.0 0.0 0:01.04 init
2 root 15 -5 0 0 0 S 0.0 0.0 0:00.00 kthreadd
3 root RT -5 0 0 0 S 0.0 0.0 0:00.00 migration/0
4 root 15 -5 0 0 0 S 0.0 0.0 0:00.11 ksoftirqd/0
5 root RT -5 0 0 0 S 0.0 0.0 0:00.00 watchdog/0
6 root 15 -5 0 0 0 S 0.0 0.0 0:00.01 events/0
7 root 15 -5 0 0 0 S 0.0 0.0 0:00.00 khelper
第一行為系統的已啟動時間,線上人數,平均負載:三個數字分別代表1、5、10分鐘
第二行為總程序數,這個例子為,126的程序,2個執行中,124個睡眠,0個已停止,0個zombie程序
第三行為CPU的整體負載
第四行為實體記憶體的使用情形
第五行為虛擬記憶體(swap)的使用情形
接下來的畫面就是各程序的狀態,與ps大致上都相同
程序的執行順序
在Linux系統中,每個程序都會擁有一個優先執行程序的屬性,利用該屬性能讓系統知道哪個程序比較重要需要先執行。當我們執行ps -l或top時會發現有兩個欄位,PRI(top為PR)和NI,這兩個欄位就是用來計算程序的執行順序的:
PRI Priority的縮寫,數值越小越優先執行
NI 系統給予我們可改變執行順序的值,需注意以下幾點:
一般使用者的NI值為0~19
一般使用者僅能調高NI值
一般使用者僅能調整自己的NI值
root的NI值為-20~19
程序執行順序=PRI+NI,我們可以透過修改NI值來決定程序的執行順序,一般來講有兩種修改的方法:
程序執行時就指定NI值(nice)
修改執行中程序的NI值(renice)
nice -n command
-n 調整的NI值
command 欲執行的指令
[root@localhost ~]# nice -n -7 vi&
[root@localhost ~]# ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 R 0 3292 3289 0 80 0 - 1493 - pts/1 00:00:00 bash
4 T 0 3387 3292 0 73 -7 - 1530 signal pts/1 00:00:00 vi
這個例子我設定vi的NI為-7,並在背景執行,並使用ps -l觀察
renice number PID
number 欲設定的NI值
PID 欲設定程序的PID
例:
[root@localhost ~]# ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 R 0 3292 3289 0 80 0 - 1493 - pts/1 00:00:00 bash
4 T 0 3387 3292 0 73 -7 - 1530 signal pts/1 00:00:00 vi
4 R 0 3397 3292 0 80 0 - 1430 - pts/1 00:00:00 ps
延用剛才的範例,我已經將vi的NI設為-7,並得知PID為3387,現在將NI值改成10:
[root@localhost ~]# renice 10 3387
3387: old priority -7, new priority 10
[root@localhost ~]# ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 R 0 3292 3289 0 80 0 - 1493 - pts/1 00:00:00 bash
4 T 0 3387 3292 0 90 10 - 1530 signal pts/1 00:00:00 vi
4 R 0 3399 3292 0 80 0 - 1431 - pts/1 00:00:00 ps
NI值真的變成10了!
程序的管理
前面只提到程序的觀察,再來要介紹管理程序的指令
再來介紹 kill這個指令,這個指令可透過傳遞信號來管理程序的執行狀態,kill的語法如下:
kill -single PID
single 傳給程序的信號代碼
PID 該程序的PID
另外 -l參數會列出可用的信號清單
一般常用的信號有:
代碼 名稱 內容
1 SIGHUP 接收到此信號後,程序會重新讀取自己的組態檔,類似重新啟動的功能
2 SIGINT 中斷、停止執行,跟Ctrl+C 有同樣的作用
9 SIGKILL 強制結束程序
15 SIGTERM 以正常程序中止程序
假設我目前有個程序狀態顯示為 Z,而他的 PID為4100,要將他強制結束可以這樣:
[root@localhost ~]# kill -9 4100
要重新啟動的話也只要將信號代碼改成 1就行了:
[root@localhost ~]# kill -1 4100
除了代碼,也可以直接使用信號名稱:
[root@localhost ~]# kill -TERM 2569
另外,若未設定任何參數,kill預設會傳送 SIGTERM(15)
另一個跟 kill有關的是 killall,使用 kill必須要知道程序的PID,而 killall則是要知道程序的指令名稱:
[root@localhost ~]# killall -9 vi
相關參數:
i interactive,互動式,當要刪除時會先詢問使用者
I 忽略大小寫
相關指令
檢視目前記憶體使用狀況
free 參數
-b 以bytes為單位
-k 以Kbytes為單位
-m 以Mbytes為單位
-g 以Gbytes為單位
-t 顯示實體與swap記憶體總量
執行結果如下:
[root@localhost ~]# free -m
total used free shared buffers cached
Mem: 2026 554 1471 0 58 299
-/+ buffers/cache: 196 1829
Swap: 1983 0 1983
沒有留言:
張貼留言