一、程序概念
核心的功用:程序管理、檔案系統、網絡功能、記憶體管理、驅動程式、 安全功能等
Process: 運作中的程式的一個副本,是被載入記憶體的一個指令集合
程序ID (Process ID ,PID )号碼被用來标記各個程序
UID 、GID 、和SELinux 語境決定對檔案系統的存取和通路權限,
通常從執行程序的使用者來繼承
存在生命周期
task struct :Linux 核心存儲程序資訊的資料結構格式
task list:多個任務的的task struct 組成的連結清單
程序建立:
init :第一個程序
父子關系
程序:都由其父程序建立,CoW copy on write
fork(), clone()
二、程序的優先級(時間片)

1.程序優先級:
系統優先級: 數字越小,優先級越高
0-139 (CentOS4,5) )
各有140 個運作隊列和過期隊列
0-98 ,99 (CentOS6) )
實時優先級: 99-0 :值最大優先級最高
nice 值:-20 到19 ,對應 系統優先級100-139 或99
Big O :時間複雜度 ,用時和規模的關系
O(1), O(logn), O(n) 線性, O(n^2) 抛物線, O(2^n)
實時優先級 動态優先級
2.程序記憶體:
Page Frame: 頁框,用存儲頁面資料,存儲Page 4k
LRU :Least Recently Used 近期最少使用算法, 釋放記憶體實體位址空間和線性位址空間
MMU :Memory Management Unit 負責轉換線性和實體位址
TLB:Translation Lookaside Buffer 翻譯 後備 緩沖器, 用于儲存虛拟位址和實體位址映射關系的緩存
3.IPC: Inter Process Communication
同一主機: signal: 信号,程序與程序之間不能直接通路記憶體空間,
shm: shared memory 找一塊共享記憶體空間,共享
semaphore: 信号量,一種計數器,兩個程序不能同時通路,一個通路後加上lock
不同主機:rpc: remote procedure call
socket: IP和端口号 套接字
三、程序狀态
Linux 核心:搶占式多任務
程序類型:
守護程序: daemon, 在系統引導過程中啟動的程序, 和終端無關程序
前台程序:跟終端相關,通過終端啟動的程序
注意:兩者可互相轉化
程序狀态:
運作态:running
就緒态:ready
睡眠态:
可中斷:interruptable
不可中斷:uninterruptable
停止态:stopped, 暫停于記憶體,但不會被排程,除非手動啟動
僵死态:zombie,結束程序,父程序結束前,子程序不關閉
四、系統管理工具
程序的分類:
CPU-Bound :CPU 密集型,非互動
IO-Bound :IO 密集型,互動
Linux 系統狀态的檢視及管理工具:pstree, ps, pidof,pgreb, top, htop, glance, pmap, vmstat, dstat, kill,pkill, job, bg, fg, nohup
(1)pstree 指令:樹狀結構
process 程序 重(耗資源)
thread 線程 輕(省記憶體)
(2)ps:顯示目前程序的狀态
Linux 系統各程序的相關資訊均儲存在/proc/PID 目錄下的各檔案中
1.支援三種選項:
UNIX 選項 如 如-A -e
BSD 選項 如 如a
GNU 選項 如 如--help
2.ps 目前終端打開的程序(所在終端編号)
a 所有終端中的程序
x 和終端無關(不連結)的程序,背景守護程序
u 顯示程序所有者、PID、cpu、記憶體、VSZ、RSS 等資訊
o 屬性… 選項顯示定制(u裡的選項,是以不和u連用)的資訊
pid 、comm 、%cpu 、%mem 、state 、tty 、[e]user(生效) 、ruser(發起)
f 顯示程序的父程序
k [/--sort] 對所選屬性排序(預設是PID排序)
-C f1.sh 檢視腳本資訊(需#!機制,執行./)
常用組合 aux -ef
VSZ: Virtualmemory SiZe ,虛拟記憶體集,線性記憶體
RSS: ReSident Size, 常駐記憶體集,真實記憶體
3.STAT :程序狀态
R :running
S: interruptable sleeping
D: uninterruptable sleeping
T: stopped
Z: zombie
+: 前台程序
l: 多線程程序
L :記憶體分頁并帶鎖
N :低優先級程序
<: 高優先級程序
s: session leader 會話(子程序)發起
(3)幾種優先級
ni: nice值
pri: priority 優先級
psr: processor CPU 編号
rtprio: 實時優先級
例:ps axo pid,cmd,psr,ni,pri,rtprio
1.nice 值 -20—19 ps o ni[ce]可以檢視
程序優先級調整:
靜态優先級:100-139
程序預設啟動時的nice 值為0 ,優先級為120
隻有根使用者才能降低nice 值(提高優先性)
nice直接指定優先級
nice -n 優先級 cmd 例:nice -n 10 ping 127.1
renice 調整優先級
renice 優先級 PID 例:renice -10 3213 超過-20—19,用-20或19
(5)pgrep按預定義的模式查詢
-u : effective user ,生效者 例:pgrep -u root
-U : real user ,真正發起運作指令者 例:pgrep -U root
-t terminal: 與指定終端相關的程序 例:pgrep -t pts/0
-l: 顯示程序名 例:pgrep -l ping
-a: 顯示完整格式的程序名 例:pgrep -a ping
-P pid: 顯示指定程序的子程序 例:pgrep-P 2314
支援正規表達式 例:pgrep -a"^pi.*"
按确切的程式名稱:/sbin/pidof
pidof程序名 查詢程序名對應的程序号,如果能查詢出來echo $? 為0值,查不出值為1
常用在腳本,例:
pidof httpd &> /dev/null || systemctl restarthttpd
五、程序管理工具
(1)uptime 顯示目前時間,系統已啟動的時間、目前上線人數,系統平均負載(1 、5 、10 分鐘的平均負載,一般不會超過1)值越大,負載越大
在工作中,uptime查詢,顯示系統已啟動的時間太長,别亂碰,機器很老,很容易故障
① 系統平均負載:
指在特定時間間隔内運作隊列中的平均程序數
② 通常每個CPU 核心的目前活動程序數不大于3,那麼系統的性能良好。 如果每個CPU 核心的任務數大于5, 那麼此主機的性能有嚴重問題
③ 如果linux 主機是1個雙核CPU,當Load Average,比核心大的超過3,不太好,為6的時候說明機器已經被充分
(2)top 預設按cpu占用率排序
1.第一行就是 uptime
第二行 tasks任務: 總數 在運作 睡眠的 stop 僵屍态
第三行欄位資訊簡介:cpu dd if=/dev/zeroof=/dev/null 純粹占用cpu,用于實驗
us :使用者空間
sy :核心空間
ni :調整nice 時間
id :空閑
wa :等待IO 時間
hi :硬中斷
si :軟中斷(模式切換)
st:虛拟機偷走的時間
第四行記憶體資訊:總數 空閑記憶體數 已經占用的 緩存buff
第五行swap資訊: 總數 空閑記憶體數 已經占用的 緩存buff
dd if=/dev/zero of=/dev/null bs=3G count=1純粹耗費swap,用于實驗
2. top :有許多内置指令(認為幹預):(打開後直接按下面的選項)
排序:
P :以占據的CPU 百分比,%CPU(預設)
M :占據記憶體百分比,%MEM
T :累積占據CPU 時長,TIME+
首部資訊顯示:
uptime 資訊:l 指令 (是否顯示)
tasks 及cpu 資訊:t 指令
cpu 分别顯示:1 ( 數字) (雙核分開看)
memory 資訊:m 指令 (3中類型顯示)
修改重新整理時間間隔:s(預設3秒一重新整理) s 10 10秒一重新整理
終止指定程序:k k 程序号 kill信号 例:k 4123 9
儲存檔案:W
退出指令:q
3.top 進去前選項
-d #:指定重新整理時間間隔,預設為3秒 秒
-b:全部顯示所有程序
-n #:重新整理多少次後退出
例:top -d 1 -n 3 一秒重新整理一次,3次後退出
4.htop 更花哨的top工具,預設沒有安裝,需從EPEL源中安裝yum -y install htop
F1 help F2 選擇格式(按空格) F3搜尋 F4過濾 F5顯示 F6 排序 F9kill
選項:
-d #: 指定延遲時間;
-u UserName: 僅顯示指定使用者的程序
-s COLUME: 以指定字段進行排序
子指令:
s: 跟蹤標明程序的系統調用
l: 顯示標明程序打開的檔案清單(包含用到的庫)
a :将標明的程序綁定至某指定CPU 核心
t: 顯示程序樹
六、記憶體工具
(1)vmstat指令:虛拟記憶體資訊,預設顯示一次就退出
① procs:
r :可運作(正運作或等待運作)程序的個數,和核心數有關
b:處于不可中斷睡眠态的程序個數( 被阻塞的隊列的長度)
② memory: :
swpd: 交換記憶體的使用總量
free :空閑實體記憶體總量
buffer :用于buffer 的記憶體總量
cache :用于cache 的記憶體總量
③ swap:
si :從磁盤交換進記憶體的資料速率(kb/s)
so:從記憶體交換至磁盤的資料速率(kb/s) 測試dd if=/dev/zero of=/dev/null bs=3G count=1
④ io:
bi :從塊裝置讀入資料到系統的速率(kb/s) 測試dd if=/dev/sda of=/dev/null
bo: 儲存資料至塊裝置的 速率 測試dd if=/dev/zeroof=/app/f1
⑤ system: :
in: interrupts 中斷速率,包括時鐘
cs: context switch 程序切換速率
⑥ cpu: :
us:Time spent running non-kernel code
sy: Time spent running kernel code
id: Time spent idle. Linux 2.5.41 前, 包括IO-waittime.
wa: Time spent waiting for IO. 2.5.41 前,包括in idle.
st: Time stolen from a virtual machine.2.6.11 前, unknown.
-s: 顯示記憶體的統計資料
#:指定重新整理時間間隔,并不退出 例:vmstat1 一秒重新整理一次
# #:指定重新整理時間間隔和重新整理幾次 例:vmstat1 10 一秒重新整理一次,刷10次退出
(2) iostat: 統計CPU 和裝置IO 資訊
每秒鐘讀取多少K的資料量 每秒鐘寫多少K的資料量 總的讀的資料量 總的寫
#:指定重新整理時間間隔,并不退出 例:iostat1 一秒重新整理一次
# #:指定重新整理時間間隔和重新整理幾次 例:iostat1 10 一秒重新整理一次,刷10次退出
(3)pmap指令:程序對應的記憶體映射,占用哪部分真正的記憶體空間
pmap [options] pid [...] 檢視是否有記憶體洩漏問題,隻存不釋放,發現記憶體不斷的增大,有問題
-x: 顯示詳細格式的資訊
例:pmap 1
另外一種實作:(顯示的差不多)
cat /proc/PID/maps 核心空間使用者空間
(4)glances指令:系統監控工具
glances [-bdehmnrsvyz1] [-B bind] [-c server] [-Cconffile] [-p port] [-P password] [--password] [-t refresh] [-f file] [-ooutput]
1.内建指令:
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
2.常用選項:
-b: 以Byte 為機關顯示網卡資料速率
-d: 關閉磁盤I/O 子產品
-f /path/to/somefile: 設定輸入檔案位置
-o {HTML|CSV} :輸出格式
-m: 禁用mount 子產品
-n: 禁用網絡子產品
-t #: 延遲時間間隔
-1 :每個CPU的相關資料單獨顯示
3. C/S 模式下運作glances 指令
伺服器模式:
glances -s -B IPADDR
IPADDR:指明監聽的本機哪個位址
用戶端模式:
glances -c IPADDR
IPADDR:要連入的伺服器端位址
(5)dstat指令:系統資源統計, 相對較新的指令,代替vmstat,iostat
yum install dstat -y
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-latency: 顯示延遲最大的程序
七、kill指令:
1.向程序發送控制信号,以實作對程序管理, 每個信号對應一個數字,信号名稱以SIG 開頭(可省略 ), 不區分大小寫
顯示目前系統可用信号: kill –l 或 trap -l
常用信号:man 7 signal
1) SIGHUP: 無須關閉程序而讓其重讀配置檔案
2) SIGINT: 中止正在運作的程序;相當于Ctrl+c
3) SIGQUIT: 相當于ctrl+\
9) SIGKILL: 強制殺死正在運作的程序
15) SIGTERM :終止正在運作的程序(預設為15)
18) SIGCONT :繼續運作
19) SIGSTOP :背景休眠
指定信号的方法:
(1) 信号的數字辨別:1, 2, 9 例:kill -1 PID
(2) 信号完整名稱:SIGHUP 例:kill -SIGHUP PID
(3) 信号的簡寫名稱:HUP 例:kill -HUP PID
2. 按程序号:
按名稱:killall [-SIGNAL] com… killall -9 bash (全殺) killall httpd
按模式:pkill [options] pattern pkill -9 "bash"支援正則
-SIGNAL
-u uid: effective user 生效者 suid特殊權限
-U uid: real user ,真正發起運作指令者
-t terminal: 與指定終端相關的程序
-l: 顯示程序名(pgrep 可用)
-a: 顯示完整格式的程序名(pgrep 可用)
-P pid: 顯示指定程序的子程序
八、作業管理
(1)Linux 的作業控制:
前台作業:通過終端啟動,且啟動後一直占據終端;
背景作業:可通過終端啟動,但啟動後即轉入背景運作(釋放終端)
背景作業雖然被送往背景運作,但其依然與終端相關;退出終端,将關閉背景作業。如果希望送往背景後,剝離與終端的關系
(2)檢視目前終端所有作業: jobs
(3)并行運作
同時運作多個程序,提高效率
1.方法1,寫進腳本
vi all.sh
f1.sh &
f2.sh &
cmd &
2.方法2
(f1.sh&);(f2.sh&);(f3.sh&)
方法3
{ f1.sh& f2.sh& f3.sh& }
{ ping -c 3 127.1 ; ping 127.2 ; }& { ping -c 3 127.3 ; ping 127.4 ; }&
九、任務計劃
Linux 任務計劃、周期性任務執行
未來的某時間點執行一次任務
at
batch :系統 自行選擇空閑時間去執行此處指定的任務
周期性運作某任務 周期性的備份,清理
cron
(1)at
1.安裝確定服務啟動
rpm -ql at 看到有servie,就想到查詢服務是否開啟
centos 7
systemctl status atd[.service] 查詢服務狀态
systemctl start atd 開啟服務
centos 6
service atdstatus
service atd start
2.at 指令:at [option] TIME
① 常用選項: 隊列資訊的配置檔案在 /var/spool/at目錄下
-V 顯示版本資訊:
-l:列出指定隊列中等待運作的作業;相當于atq 例:at -l
-d #:删除指定的作業;相當于atrm
-c #:檢視具體作業任務 例:at -c 1
-f路徑 :從指定的檔案中讀取任務 例:at -f at.txt 12:12
-m: 當任務完成後,即使沒有标準輸出也強制發郵件
因為是互動式的,是以可以事先把計劃任務寫到腳本裡,再用管道實作非互動,<,-f
cat at.log |at 12:12
at 寫完任務 按Ctrl +d 退出
注意:作業執行指令的結果中的标準輸出和錯誤以郵件通知給相關使用者,為了減少生成垃圾郵件,可以加上 &> /dev/null
② TIME: 定義出什麼時候進行 at 這項任務的時間
HH:MM [YYYY-mm-dd]
noon(12:00), midnight(00:00), teatime (4pm)
tomorrow
now+#{minutes,hours,days,OR weeks}
at 時間格式
HH:MM 在今日的 HH:MM 進行,若該時刻已過,則明天此時執行任務
HH:MM YYYY-MM-DD 02:00 2016-09-20 規定在某年某月的某一天的特殊時刻進行該項任務
HH:MM[am|pm] [Month] [Date] 例:04pm March 例:17:20 tomorrow
HH:MM[am|pm] + number [minutes|hours|days|weeks] 在某個時間點再加幾個時間後才進行該項任務
例:now + 5 minutes
02pm + 3 days
③ 執行方式:
1)互動式 2)輸入重定向 例:at12:12: 2017-12-12 < at.txt 3)at –f 檔案
依賴與atd 服務, 需要啟動才能實作at 任務
at 隊列存放在/var/spool/at目錄中,是以重新開機仍在
/etc/at.{allow,deny} 控制使用者是否能執行at 任務
白名單:/etc/at.allow 預設不存在
黑名單:/etc/at.deny 預設存在,拒絕該檔案中使用者執行at 指令
如果兩個檔案都不存在有,隻有 root 行 可以執行 at
有allow > deny,allow優先級最大
沒at.allow,at.deny隻有root才有權限執行at
沒allow有deny deny中使用者不能執行,其他使用者預設允許
有allow有deny 隻有allow中使用者才能執行
(2)cron
1.相關的程式包:(預設都安裝了)
cronie: 主程式包,提供crond 守護程序及相關輔助工具
cronie-anacron :cronie 的補充 程式,用于 監控cronie任務執行 狀況,如cronie 中的任務在過去該運作的時間點未能正常運作,則anacron 會随後啟動一次此任務
crontabs :包含CentOS 提供系統維護任務
rpm -ql cronie 和 at 一樣
CentOS 7:
systemctl status crond
CentOS 6:
service crond status
2.系統cron 任務:系統維護作業 /etc/crontab(隻有root才有權限)
使用者cron 任務: crontab 指令
日志:/var/log/cron
① 系統cron 任務:/etc/crontab
詳情參見 man 5 crontab
② 時間表示法:
特定值 給定時間點有效取值範圍内的值
* 給定時間點上有效取值範圍内的所有值,表示“每...”
離散取值 #,#,#
連續取值 #-#
在指定時間範圍上,定義步長 /#: #
③ 時間格式
@reboot Run once after reboot.
@yearly 0 0 1 1 *
@annually 0 0 1 1 *
@monthly 0 0 1 * *
@weekly 0 0 * * 0
@daily 0 0 * * *
@hourly 0 * * * *
系統的計劃任務:
/etc/cron.d 目錄 vim /etc/cron.d/0hourly
/etc/cron.d/ 配置檔案
/etc/cron.hourly/ 腳本
/etc/cron.daily/ 腳本
/etc/cron.weekly/ 腳本
/etc/cron.monthly/ 腳本
date -d "yesterday" +%F 建立昨天的時間的檔案
date -d "-2 day" +%F 建立前天的時間的檔案 date -d "-/+# day" +%F
3.使用者cron
crontab 指令定義,每個使用者都有專用的cron 任務檔案:
/var/spool/cron/USERNAME
crontab指令:
相當于vi 打開的,沒有顔色,export EDITOR=vim 用vim打開,寫到配置檔案/etc/profile.d/*.sh
crontab [-u user] [-l | -r | -e] [-i]
-l: 列出所有任務;
-e: 編輯任務;改任務 crontab -e 寫自己的計劃任務
-r: 移除所有任務;
-i :同-r 一同使用,以互動式模式移除指定任務
-u user: 僅root 可運作,指定使用者管理cron 任務
例:su - wang crontab -e
控制使用者執行計劃任務 :
/etc/cron.{allow,deny}
注意:對于cron 任務來講,% 有特殊用途;如果在指令中要使用%, ,則需要轉義,将%
4.秒級 sleep 0.5 支援小數點 usleep 以微秒為機關 10^6微秒 為 1秒
* * * * * root ls;sleep 20;pwd;sleep 20;...
4.anacron 系統 ,運作計算機關機時cron不運作的任務,因為企業不常關機,所有不常用
運作計算機關機時cron不運作的任務,CentOS6 以後版本取消anacron 服務,由crond 服務管理
對筆記本電腦、桌上型電腦、工作站、偶爾要關機的伺服器及其它不一直開機的系統很重要對很有用
配置檔案:/etc/anacrontab ,負責執行/etc/ cron.daily/etc/cron.weekly /etc/cron.monthly 中系統任務。
字段1 :如果在這些日子裡沒有運作這些任務……
字段2 :在重新開機後等待這麼多分鐘後運作它
字段3 :任務識别器,在日志檔案中辨別
字段4 :要執行的任務
由/etc/cron.hourly/0anacron 執行
當執行任務時,更新/var/spool/anacron/cron.daily 檔案的時間戳
5.定時清除臨時檔案
CentOS6 使用/etc/cron.daily/tmpwatch 定時清除臨時檔案
CentOS7 使用systemd-tmpfiles-setup 服務實作
配置檔案:
/etc/tmpfiles.d/*.conf
/run/tmpfiles.d/*.conf
/usr/lib/tmpfiles/*.conf
/usr/lib/tmpfiles.d/tmp.conf
d /tmp 1777 root root 10d
d /var/tmp 1777 root root 30d
指令:
systemd-tmpfiles –clean|remove|createconfigfile