linux-基礎知識-23天
Linux進程及作業管理
內核的功用:進程管理、文件系統、網絡功能、內存管理、驅動程序、安全功能
Process: 運行中的程序的一個副本;
存在生命周期
Linux內核存儲進程信息的固定格式:task struct
多個任務的的task struct組件的鏈表:task list
進程創建:
init
父子關系
進程:都由其父進程創建
fork(), clone()
進程優先級:
0-139:
1-99:實時優先級;
100-139:靜態優先級;
數字越小,優先級越高;
Nice值:
-20,19
Big O
O(1), O(logn), O(n), O(n^2), O(2^n)
進程內存:
Page Frame: 頁框,用存儲頁面數據
存儲Page
MMU:Memory Management Unit
IPC: Inter Process Communication
同一主機上:
signal
shm: shared memory
semerphor
不同主機上:
rpc: remote procecure call
socket:
Linux內核:搶占式多任務
進程類型:
守護進程: 在系統引導過程中啟動的進程,跟終端無關的進程;
前臺進程:跟終端相關,通過終端啟動的進程
註意:也可把在前臺啟動的進程送往後臺,以守護模式運行;
進程狀態:
運行態:running
就緒態:ready
睡眠態:
可中斷:interruptable
不可中斷:uninterruptable
停止態:暫停於內存中,但不會被調度,除非手動啟動之;stopped
僵死態:zombie
進程的分類:
CPU-Bound
IO-Bound
《Linux內核設計與實現》,《深入理解Linux內核》
Linux進程查看及管理的工具:pstree, ps, pidof, pgrep, top, htop, glance, pmap, vmstat, dstat, kill, pkill, job, bg, fg, nohup
pstree命令:
pstree - display a tree of processes
ps: process state
ps - report a snapshot of the current processes
Linux系統各進程的相關信息均保存在/proc/PID目錄下的各文件中;
ps [OPTION]...
選項:支持兩種風格
常用組合:aux
u: 以用戶為中心組織進程狀態信息顯示
a: 與終端相關的進程;
x: 與終端無關的進程;
~]# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
VSZ: Virtual memory SiZe,虛擬內存集
RSS: ReSident Size, 常駐內存集
STAT:進程狀態
R:running
S: interruptable sleeping
D: uninterruptable sleeping
T: stopped
Z: zombie
+: 前臺進程
l: 多線程進程
N:低優先級進程
<: 高優先級進程
s: session leader
常用組合:-ef
-e: 顯示所有進程
-f: 顯示完整格式程序信息
常用組合:-eFH
-F: 顯示完整格式的進程信息
-H: 以進程層級格式顯示進程相關信息
常用組合:-eo, axo
-eo pid,tid,class,rtprio,ni,pri,psr,pcpu,stat,comm
axo stat,euid,ruid,tty,tpgid,sess,pgrp,ppid,pid,pcpu,comm
ni: nice值
pri: priority,優先級
psr: processor, CPU
rtprio: 實時優先級
pgrep, pkill:
pgrep [options] pattern
pkill [options] pattern
-u uid: effective user
-U uid: real user
-t terminal: 與指定終端相關的進程
-l: 顯示進程名
-a: 顯示完整格式的進程名
-P pid: 顯示其父進程為此處指定的進程的進程列表
pidof:
根據進程名獲取其PID;
top:
有許多內置命令:
排序:
P:以占據的CPU百分比;
M:占據內存百分比;
T:累積占據CPU時長;
首部信息顯示:
uptime信息:l命令
tasks及cpu信息:t命令
cpu分別顯示:1 (數字)
memory信息:m命令
退出命令:q
修改刷新時間間隔:s
終止指定進程:k
選項:
-d #: 指定刷新時間間隔,默認為3秒;
-b: 以批次方式;
-n #: 顯示多少批次;
htop命令:
選項:
-d #: 指定延遲時間;
-u UserName: 僅顯示指定用戶的進程;
-s COLOMN: 以指定字段進行排序;
命令:
s: 跟蹤選定進程的系統調用;
l: 顯示選定進程打開的文件列表;
a:將選定的進程綁定至某指定CPU核心;
t: 顯示進程樹
註意:Fedora-EPEL源
Linux進程查看及管理的工具:pstree, ps, pidof, pgrep, top, htop, glances, pmap, vmstat, dstat, kill, pkill, job, bg, fg, nohup
vmstat命令:
vmstat [options] [delay [count]]
procs:
r:等待運行的進程的個數;
b:處於不可中斷睡眠態的進程個數;(被阻塞的隊列的長度);
memory:
swpd: 交換內存的使用總量;
free:空閑物理內存總量;
buffer:用於buffer的內存總量;
cache:用於cache的內存總量;
swap:
si:數據進入swap中的數據速率(kb/s)
so:數據離開swap中的數據速率(kb/s)
io:
bi:從塊設備讀入數據到系統的速率;(kb/s)
bo: 保存數據至塊設備的速率;
system:
in: interrupts, 中斷速率;
cs: context switch, 進程切換速率;
cpu:
us
sy
id
wa
st
選項:
-s: 顯示內存的統計數據
pmap命令:
pmap - report memory map of a process
pmap [options] pid [...]
-x: 顯示詳細格式的信息;
另外一種實現:
# cat /proc/PID/maps
glances命令:
glances [-bdehmnrsvyz1] [-B bind] [-c server] [-C conffile] [-p port] [-P password] [--password] [-t refresh] [-f file] [-o output]
內建命令:
a Sort processes automatically l Show/hide logs
c Sort processes by CPU% b Bytes or bits for network I/O
m Sort processes by MEM% w Delete warning logs
p Sort processes by name x Delete warning and critical logs
i Sort processes by I/O rate 1 Global CPU or per-CPU stats
d Show/hide disk I/O stats h Show/hide this help screen
f Show/hide file system stats t View network I/O as combination
n Show/hide network stats u View cumulative network I/O
s Show/hide sensors stats q Quit (Esc and Ctrl-C also work)
y Show/hide hddtemp stats
常用選項:
-b: 以Byte為單位顯示網卡數據速率;
-d: 關閉磁盤I/O模塊;
-f /path/to/somefile: 設定輸入文件位置;
-o {HTML|CSV}:輸出格式;
-m: 禁用mount模塊
-n: 禁用網絡模塊
-t #: 延遲時間間隔
-1:每個CPU的相關數據單獨顯示;
C/S模式下運行glances命令:
服務模式:
glances -s -B IPADDR
IPADDR: 指明監聽於本機哪個地址
客戶端模式:
glances -c IPADDR
IPADDR:要連入的服務器端地址
dstat命令:
dstat [-afv] [options..] [delay [count]]
-c: 顯示cpu相關信息;
-C #,#,...,total
-d: 顯示disk相關信息;
-D total,sda,sdb,...
-g:顯示page相關統計數據;
-m: 顯示memory相關統計數據;
-n: 顯示network相關統計數據;
-p: 顯示process相關統計數據;
-r: 顯示io請求相關的統計數據;
-s: 顯示swapped相關的統計數據;
--tcp
--udp
--unix
--raw
--socket
--ipc
--top-cpu:顯示最占用CPU的進程;
--top-io: 顯示最占用io的進程;
--top-mem: 顯示最占用內存的進程;
--top-lantency: 顯示延遲最大的進程;
kill命令:
向進程發送控制信號,以實現對進程管理
顯示當前系統可用信號:
# kill -l
# man 7 signal
常用信號:
1) SIGHUP: 無須關閉進程而讓其重讀配置文件;
2) SIGINT: 中止正在運行的進程;相當於Ctrl+c;
9) SIGKILL: 殺死正在運行的進程;
15) SIGTERM:終止正在運行的進程;
18) SIGCONT:
19) SIGSTOP:
指定信號的方法:
(1) 信號的數字標識;1, 2, 9
(2) 信號完整名稱;SIGHUP
(3) 信號的簡寫名稱;HUP
向進程發信號:
kill [-SIGNAL] PID...
終止“名稱”之下的所有進程:
killall [-SIGNAL] Program
Linux的作業控制
前臺作業:通過終端啟動,且啟動後一直占據終端;
後臺作業:可以通過終端啟動,但啟動後即轉入後臺運行(釋放終端);
如何讓作業運行於後臺?
(1) 運行中的作業
Ctrl+z
(2) 尚未啟動的作業
# COMMAND &
此類作業雖然被送往後臺運行,但其依然與終端相關;如果希望送往後臺後,剝離與終端的關系:
# nohup COMMAND &
查看所有作業:
# jobs
作業控制:
# fg [[%]JOB_NUM]:把指定的後臺作業調回前臺;
# bg [[%]JOB_NUM]:讓送往後臺的作業在後臺繼續運行;
# kill [%JOB_NUM]:終止指定的作業;
進程優先級調整:
靜態優先級:100-139
進程默認啟動時的nice值為0,優先級為120;
nice命令:
nice [OPTION] [COMMAND [ARG]...]
renice命令:
renice [-n] priority pid...
查看:
ps axo pid,comm,ni
netstat命令:
netstat - Print network connections, routing tables, interface statistics, masquerade connections, and multicast memberships
顯示網絡連接:
netstat [--tcp|-t] [--udp|-u] [--raw|-w] [--listening|-l] [--all|-a] [--numeric|-n] [--extend|-e[--extend|-e]] [--program|-p]
-t: tcp協議相關
-u: udp協議相關
-w: raw socket相關
-l: 處於監聽狀態
-a: 所有狀態
-n: 以數字顯示IP和端口;
-e:擴展格式
-p: 顯示相關進程及PID
常用組合:
-tan, -uan, -tnl, -unl
顯示路由表:
netstat {--route|-r} [--numeric|-n]
-r: 顯示內核路由表
-n: 數字格式
顯示接口統計數據:
netstat {--interfaces|-I|-i} [iface] [--all|-a] [--extend|-e] [--program|-p] [--numeric|-n]
# netstat -i
# netstat -I IFACE
基本語法
========
過濾主機
--------
- 抓取所有經過 eth1,目的或源地址是 192.168.1.1 的網絡數據
# tcpdump -i eth1 host 192.168.1.1
- 源地址
# tcpdump -i eth1 src host 192.168.1.1
- 目的地址
# tcpdump -i eth1 dst host 192.168.1.1
過濾端口
--------
- 抓取所有經過 eth1,目的或源端口是 25 的網絡數據
# tcpdump -i eth1 port 25
- 源端口
# tcpdump -i eth1 src port 25
- 目的端口
# tcpdump -i eth1 dst port 25網絡過濾
--------
# tcpdump -i eth1 net 192.168
# tcpdump -i eth1 src net 192.168
# tcpdump -i eth1 dst net 192.168
協議過濾
--------
# tcpdump -i eth1 arp
# tcpdump -i eth1 ip
# tcpdump -i eth1 tcp
# tcpdump -i eth1 udp
# tcpdump -i eth1 icmp
常用表達式
----------
非 : ! or "not" (去掉雙引號)
且 : && or "and"
或 : || or "or"
- 抓取所有經過 eth1,目的地址是 192.168.1.254 或 192.168.1.200 端口是 80 的 TCP 數據
# tcpdump -i eth1 ‘((tcp) and (port 80) and ((dst host 192.168.1.254) or (dst host
192.168.1.200)))‘
- 抓取所有經過 eth1,目標 MAC 地址是 00:01:02:03:04:05 的 ICMP 數據
# tcpdump -i eth1 ‘((icmp) and ((ether dst host 00:01:02:03:04:05)))‘
- 抓取所有經過 eth1,目的網絡是 192.168,但目的主機不是 192.168.1.200 的 TCP 數據
# tcpdump -i eth1 ‘((tcp) and ((dst net 192.168) and (not dst host 192.168.1.200)))‘
linux-基礎知識-23天