進程概念
內核的功用:進程管理,文件系統,網絡功能,內存管理,驅動程序,安全功能等
Process:運行中的程序的一個副本,是被載入內存的一個指令集和
進程ID(Process ID,PID)號碼被用來標記各個進程
UID,GID和SELinux語境決定對文件系統的存取和訪問權限
通常從執行進程的用戶來繼承
存在生命周期
task struct:linux內核存儲進程信息的數據結構格式
task list:多個任務的task struct組成的鏈表
進程創建:
init:第一個進程
父子關系(之后的都是其子進程)
進程:都由其父進程創建,CoW(寫時復制)
進程優先級
系統優先級:數字越小,優先級越高
0-139(CentOS4,5)
各有140個運行隊列和過期隊列
0-98,99(CentOS)
實時優先級:99-0:值最大優先級最高
nice值:-20到19,對應系統優先級100-139或者99(-20最大,19最小)
Big O:時間復雜度,用時和規模的關系
O(1), O(logn), O(n) 線性, O(n^2) 拋物線, O(2^n)
進程內存:
Page Frame:頁框,用存儲頁面數據,存儲Page 4k
LRU:Least Recently Used 近期最少使用算法,釋放內存
物理地址空間和線性地址空間
MMU:Memory Management Unit負責轉換線性和物理地址
IPC:Inter Process Communication
同一主機上
signal
shm:shared memory
semophore 信號量,一種計數器
不同主機上:
rpc:remote procedure call
socket: IP和端口號
linux內核:搶占式多任務
進程類型:
守護進程:daemon,在系統引導過程中啟動的進程,和終端無關進程
前臺進程:跟終端相關,通過終端啟動的進程
注意:兩者可相互轉化
進程狀態:
運行態:running
就緒態:ready
睡眠態:
可中斷:interruptable
不可中斷:uninterruptable
停止態:stopped,暫停與內存中,但不會被調度,除非手動啟動
僵死態:zombie,結束進程,父進程結束前,子進程不關閉
系統管理工具
進程的分類:
CPU-Bound:CPU密集型,非交互
IO-Bound:IO密集型,交互式
linux系統狀態的查看及管理工具:
pstree,ps,pidof,pgrep,top,htop,glance,pmap,vmstat,dstat,kill
pkill,job,bg,fg,nohup
pstree命令:
pstree:以樹狀圖的方式展示進程之間的派生關系,顯示效果比較直觀
-p:顯示當前使用進程的進程號和進程ID
-a:顯示所有進程的詳細信息,遇到相同的進程可以壓縮顯示
ps命令
ps命令用于報告當前系統的進程狀態??梢源钆鋕ill指令隨時中斷,刪除不必要的程序。ps命令是最基本同時也是非常強大的進程查看命令,使用該命令可以確定有哪些進程正在運行和運行的狀態,進程是否結束,進程有沒有僵死,那些進程占用了過多的資源等等,總之大部分信息都是可以通過執行該命令得到的
Linux系統各進程的相關信息均保存在/proc/PID目錄下的個文件中
支持三種選項:
UNIX選項 如-A -e
BSD選項 如 a
GUN選項 如 –help
默認顯示當前終端的進程
a:包括所有終端中進程
x:包括不鏈接終端的進程
u:顯示進程屬主的信息
f:顯示進程的父進程
o 屬性..:顯示定制的信息
屬性:pid,comm,%cpu,%mem,state,tty,euser,ruser
VAZ:Virtual memory SiZe,虛擬內存集,線性內存
RSS:ReSident Size,常駐內存集
STAT:進程狀態
R:running運行態
S:interrupatable sleeping (睡眠態可中斷)
D:uninterrupatable sleeping(睡眠態不可中斷)
T:stopped 停止態
Z:zombie 僵死態
+:前臺進程
l:多線程進程
N:低優先級進程
<:高優先級進程
s:session leader,會話(子進程)發起者
常用組合:-ef
-e:顯示所有進程
-f:顯示完整格式程序信息
常規格式:-eFH
-F:顯示更完整格式的進程信息
-H:以進程層級格式顯示進程相關信息
常用格式:自定義
ni:nice值
pri:priority 優先級
psr:procrssor CPU編號
rtprio:實時優先級
-eo pid,tid,clss,rtprio,ni,pri,psr,pcpu,stat,comm
axo atat,euid,ruid,tty,tpfid,sess,pgrp,ppid,pid,pcpu,comm
pgrep命令
pgrep命令以名稱為依據從運行進程中隊列中查找進程,并顯示查找到的進程ID,每一個進程ID以一個十進制數表示,通過一個分隔符
和下一個ID分開,默認分隔符為一個新行。對于每一個屬性選項,用戶可以在命令上指定一個以逗號分隔的可能值的集合
選項:
-u uid :effective user,進程生效者
-U uid:real user,真正發起運行命令者
-t terminal:與指明終端相關的進程
-l:顯示進程名
-a:顯示完整格式的進程名
-p pid:顯示指定進程的子進程
按確切的程序名稱:/sbin/pidof
uptime
顯示當前時間,系統 已啟動的時間、當前上線人數,系統平均負載(1 、5 、10 分鐘的平均負載,一般不會超過1) )
系統平均負載:
指在特定時間間隔內運行隊列中的平均進程數 。
如果 每個CPU 內核的當前活動進程數不大于3 的話,那么系統的 性能良好。 如果每個CPU 內核的任務數大于5 ,那
么這臺機器的性能有嚴重問題。
如果linux 主機是1 個雙核CPU 的話,當Load Average為6的時候說明機器已經被充分使用了。
top
實時動態地查看系統的整體運行情況,是一個綜合了多方信息監測系統性能和運行信息的實用工具,通過top命令所提供的互動式界面,
可以用熱鍵進行管理。
top有許多內置命令
排序:
P:以占據的CPU百分比,%CPU
M:占據內存百分比。%MEM
T:累積占據CPU時長,TIME+
首部信息顯示:
uptime信息:l命令
task及cou信息:t命令
cpu分別顯示:1(數字)
memory信息:m命令
退出命令:q
修改刷新時間間隔:s
終止指定進程:k
保存文件:W
欄位信息簡介
us:用戶空間
sy:內核空間
ni:調整nice時間
id:空閑
wa:等待IO時間
hi:硬中斷
si:軟中斷(模式切換)
st:虛擬機偷走的時間
欄位信息間接
PID (Process Id): 任務的進程ID
PPID (Parent Process Pid): 父任務的進程ID
RUSER (Real User Name): 任務的所有者真實名稱
UID (User Id): 任務所有者ID
USER (User Name): 任務所有者名稱
GROUP (Group Name): 任務所有者群組名
TTY (Controlling Tty): 終端
PR (Priority): 優先級
%CPU (CPU usage):CPU 使用率
%MEM (Memory usage (RES)): 內存使用率
S (Process Status): 進程狀態
TIME+ (CPU Time, hundredths):CPU
選項:
-d #:指定刷新時間間隔,默認為3秒
-b:以批次方式
-n #:顯示多少批次
htop命令(需Fedora-EPEL安裝)
選項:
-d #:指定延遲時間
-u UserName:僅顯示指定用戶的進程
-s COLUME:以指定字段進行排序
交互式子命令:
各種使用命令在交互式界面都有顯示,就不介紹了,一目了然!
s:跟蹤選定進程的系統調用;
l:顯示選定進程打開的文件列表
a:將選定的進程綁定之某指定CPU核心
t:顯示進程樹
內存工具
vmstat命令:虛擬內存信息,可以報告關于進程,內存,I/O等系統整體運行狀態
vmstat 2 5 (沒2秒顯示一次,共顯示五次)
字段說明:
procs(進程)
r:運行隊列中進程數量,這個值也可以判斷是否需要增加CPU(如長期大于1)
b:等待IO的進程數量
memory(內存)
swpd:使用虛擬內存大小,如果swpd的值不為0,但是SI,SO的值長期為0,這種情況不會影響系統性能
free:空閑物理內存大小
buff:用作緩沖的內存大小
cache:用作緩存的內存大小,如果cache的值大的時候,說明cache出的文件多,如果頻繁訪問到的文件
都能被cache處,那么磁盤讀IO bi會非常小
swap
si:每秒從交換區寫到內存的大小,由磁盤調入內存
so:每秒寫入交換區的內存大小,由內存調入磁盤
IO(現在的Linux版本塊大小為1kb)
bi:每秒讀取的塊數
bo:每秒寫入的塊數
system(系統)
in:每秒中斷數,包括時鐘中斷
cs:每秒上下文切換數(進程切換頻率)
注意:此二選值越大,會看到內核消耗的CPU時間會越大
CPU(以百分比表示)
us:用戶進程執行時間按百分比(user time)
us的值比較高時,說明用戶進程消耗CPU時間多,但是如果長期超過50%的使用,那么或許就該考慮優化程序算法
或者進行加速了
sy:內核系統進程執行時間百分比(system time)
sy的值高時,說明系統內核消耗的CPU資源多,這并不是良性表現,應該檢查下原因
wa:IO等待時間的百分比
wa的值高時,說明IO等待比較嚴重,這可能由于磁盤大量隨機訪問造成,也有可能磁盤出現瓶頸(塊操作)
id:空閑時間百分比
st:Time stolen from a virtual machine. 2.6.11 前, unknown.
選項
-a:顯示活動內頁
-f:顯示啟動后創建的進程總數
-m:顯示slab信息
-n:頭信息僅顯示一次
-s:以表格方式顯示時間計數器和內存狀態
-d:報告磁盤狀態
-p:顯示指定的磁盤分區狀態
-S:輸出信息的單位(k,K,m,M)
pmap命令
用于報告進程的內存映射關系,是Linux調試及運維的一個很好的工具
選項
-x:顯示擴展格式
-d:顯示設備格式
-q:不顯示頭尾行
-v:顯示指定版本
系統監控工具
glances命令(EPEL安裝)
glances [-bdehmnrsvyz1] [-B bind] [-c server] [-C conffile] [-p port] [-P password] [–password] [-t refresh] [-f file] [-o output]
命令選項:
-b:顯示網絡連接速度Byte/秒
-B @IP|HOST:綁定服務器端IP地址或者主機名稱
-c @IP|HOEST:連接glances服務器端
-C file:配置文件路徑默認位置為/etc/glances/glances.conf
-d:關閉磁盤I/O模塊
-e:顯示傳感器溫度
-f file:設置輸出文件(格式為HTML或者CSV)
-m:關閉掛載的磁盤模塊
-n:關閉網絡模塊
-p PORT:設置客戶端/服務器運行端口(默認為61209)
-P PASSWORD:設置客戶端/服務器密碼
-s:設置glances運行模式為服務器
-t SECONDS :設置屏幕刷新的時間間隔,單位為秒(默認為3秒),范圍為1-32767
-h:顯示幫助信息
-v:顯示版本信息
-1:每個CPU的相關數據單獨顯示
glances命令的交互式界面和top命令的相似,操作方法也是類似的,顯示字段意義如下:
CTRT:虛擬內存大小
RES:進程占用的物理內存值
%CPU:該進程占用的CPU使用率
%MEM:該進程占用的物理內存和總內存的百分比
PID:進程ID號
USER:進程所有者的用戶名
TIME+:該進程啟動后占用的總的CPU時間
IO_R和IO_W:進程那個的讀寫I/O速率
NAME:進程名稱
NI:進程優先級
S:進程狀態,其中S表示休眠,R表示正在運行,Z表示僵死狀態
交互式界面下可以使用的快捷鍵的功能如下:
h:顯示幫助信息
q:離開程序退出
c:按照CPU實時負載對系統進程進行排序
m:按照內存使用狀況對系統進程排序
i:按照I/O使用狀況對系統進程排序
p:按照進程名稱排序
d:顯示磁盤讀寫狀況
w:刪除日志文件
l:顯示日志
1:每個CPU的相關數據單獨顯示
s:顯示傳感器信息
f:顯示系統信息
在C/S模式下運行glances命令
服務模式:
glances -s -B IPADDR 指明監聽的本機哪個地址
客戶端模式
glances -c IPADDR 指明要連入的服務器端地址
dstat命令:系統資源統計
dstat [-afv] [options…] [delay [count]]
-c:顯示cpu相關信息
-C #,#,…,total
-d:顯示dick相關信息
-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-men:顯示最占用內存的進程
–top-latency:顯示延遲最大的進程
備注:如果要組合使用,后面四項須放在最后
kill命令
向進程發送控制信號,以實現對進程管理
顯示當前系統可用信號:kill -l
1)SIGHUP:無須關閉進程而讓其重讀配置文件
2)SIGINT:終止正在運行的進程;相當于Ctrl+c
9)SIGKILL:殺死正在運行的進程
15)SIGTERM:終止正在運行的進程
18)SIGCONT:繼續運行
19)SIGSTOP:后臺休眠
指定信號的方法:
1.信號的數字標識;1,2,9….
2.信號完整名稱;SIGHUP
3.信號的簡寫名稱;HUP
按PID:kill [-SIGNAL] pid
按名稱:killall [-SIGNAL] comm….
按模式:pkill [options] pattern 按照進程名殺死進程。
-SIGNAL
-u uid:effective user,生效者
-U uid:real user,真正發起運行命令者
-t terminal:與指定終端相關的進程
-l:顯示進程名
-a:顯示完整格式的進程名
-P pid:顯示父進程為此處指定的進程的進程列表
作業管理
Linux的作業控制
前臺控制:通過終端啟動,且啟動后一直占據終端
后臺作業:可通過終端啟動,但啟動后即轉入后臺運行(釋放終端)
如何讓作業運行于后臺
1.運行中的作業:Ctrl+z
2.尚未啟動的作業:command &
后臺作業雖然被送往后臺運行,但其依然與終端相關;退出終端,將關閉后臺作業。如果希望送往后臺
后,剝離與終端的關系
此處的ping隨便有顯示輸出,但是已經是后臺進程了 ,所以使用Ctrl+c無法終止的,正常執行ping命令是可以
使用Ctrl+c終止的
查看所有作業:
jobs
作業控制:
fg [[%]JOB_NUM] :把指定的后臺作業調回前臺;
bg [[%]JOB_NUM] :讓送往后臺的作業在后臺繼續運行;
kill [%JOB_NUM] :終止指定的作業;
將剛才ping命令調回前臺后可以Ctrl+c終止了
并行運行
方法一:
vi all.sh
f1.sh&
f2.sh&
f3.sh&
方法二
(f1.sh&);(f2.sh&);(f3.sh&);
方法三
{ f1.sh& f2.sh& f3.sh& }
進程優先級
靜態優先級:100-139
進程默認啟動時的nice值為0,優先級為120
只有根用戶才能降低nice值(提高優先級)
nice命令:用于以指定的進程調度優先級啟動其他的程序
nice [OPTION] [COMMAND [ARG]…]
renice 命令:
renice [-n] priority pid..
查看:
ps axo pid,comm,ni
任務計劃
Linux任務計劃,周期性任務執行
未來的某時間點執行一次任務
at
at命令用于在指定時間執行命令。at允許使用一套相當復雜的指定時間的方法。它能夠接受在當天的hh:mm(小時:分鐘)式的時間指定。
假如該時間已過去,那么就放在第二天執行。當然也能夠使用midnight(深夜),noon(中午),teatime(飲茶時間,一般是下午4點)
等比較模糊的 詞語來指定時間。用戶還能夠采用12小時計時制,即在時間后面加上AM(上午)或PM(下午)來說明是上午還是下午。
也能夠指定命令執行的具體日期,指定格式為month day(月 日)或mm/dd/yy(月/日/年)或dd.mm.yy(日.月.年)。
指定的日期必須跟在指定時間的后面。
也可使用相對計時發,這對于安排不久就要執行的命令是有很好用處的。指定格式為now + count time,now是指當前時間,time是時間單位,
這里可以是mintues(分鐘),hours(小時),days(天),weeks(星期)。count是時間的數量。還可以直接使用today,tomorrow來指定
完成命令的時間。
at [option] TIME
常用選項:
-V:顯示版本信息
-l:列出指定隊列中等待運行的作業;相當于atq
-d:刪除指定的作業;相當于atrm
-c:查看具體作業任務
-f /path/from/somefile:從指定的文件中讀取任務
-m:當任務被完成之后,將給用戶發送郵件,即使沒有標準輸出
注意:作業執行命令的結果中的標準輸出和錯誤以郵件通知給相關用戶
執行結果:
TIME:定義出什么時候進行at這選任務的時間
HH:MM[yyyy-mm-dd]
noon,midnight,teatime(4pm)tomorrow
now +#{minutes,hours,days,OR weeks}
at時間格式
HH:MM 02:00
在今日的 HH:MM 進行,若該時刻已過,則明天此時執行任務
HH:MM YYYY-MM-DD 04:00 2016-09-20
規定在某年某月的某一天的特殊時刻進行該項任務
HH:MM[am|pm] [Month] [Date]
04pm March 17
17:20 tomorrow
HH:MM[am|pm] + number [minutes|hours|days|weeks]
在某個時間點再加幾個時間后才進行該項任務
now + 5 minutes
04pm + 3 days
執行方式:
1)交互式 2向 )輸入重定向 3 )at –f 文件
依賴與atd 服務, 需要啟動才能實現at 任務
at 隊列存放在/var/spool/at 目錄中
/etc/at.{allow,deny} 控制用戶是否能執行at 任務
白名單:/etc/at.allow 默認不存在,只有該文件中的用戶才能執行at 命令
黑名單:/etc/at.deny 行 拒絕該文件中用戶執行 at 命令, 而沒有在 在at.deny
文件中的使用 者則可執行
如果兩個文件都不存在有 ,只有root行可以執行at
注意事項:
以下不包含root用戶
白名單優先級高于黑名單
當白名單文件生成后,不在白名單的用戶都沒權限使用at了
沒有白名單文件時,在黑名單的用戶都沒權限使用at
如果白名單和黑名單文件都不存在,則是任何人都沒權限使用at
batch:系統自行選擇空閑時間去執行此處指定的任務
周期性運行某任務cron
相關的程序包:
cronie:主程序包,提供crond守護進程及相關輔助工具
cronie-anacron:cronie的補充程序;用于監控cronise任務執行狀況;
如cronie中的任務在過去該運行的實際帶你未能正常運行,則anacron會隨后啟動一次此任務
crontabs:包含CentOS提供系統維護任務
計劃任務
確保crond守護處于運行狀態:
CentOS 7 :
systemctl status crond
CentOS 6 :
service crond status
計劃周期性執行的任務提交給crond,到指定時間會自動運行
系統cron任務:系統維護作業
/etc/crontab
用戶cron任務:
crontab
日志:/etc/log/cron
系統cron 任務:/etc/crontab
注釋行以 # 開頭
詳情參見 man 5 crontab
# Example of job definition:
# .—————- minute (0 – 59)
# | .————- hour (0 – 23)
# | | .———- day of month (1 – 31)
# | | | .——- month (1 – 12) OR jan,feb,mar,apr …
# | | | | .—- day of week (0 – 6) (Sunday=0 or 7) OR
sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
時間表示法:
1.特定值:
給定時間有效取值范圍內的值
2.*
給定時間點上有效取值范圍內的所有值
表示 “每…..”
3.離散取值:
#,#,#
4.連續取值:-
#-#
5.在指定時間范圍內,定義步長:
/#:#即步長(表示每…)
例如:每3小時執行一次echo命令
0 */3 * * * centos /bin/echo “howdy”
時間格式
@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/crontab
/etc/cron.d/ 配置文件
/etc/cron.horuly/ 腳本
/etc/cron.daily/ 腳本
/etc/cron.weedly/ 腳本
/etc/cron.monthly/ 腳本
anacron系統
運行計算機關機時cron 不運行的任務, ,CentOS6 以后 版本取消
anacron 服務,由crond 服務管理。
假設計算機沒有一直開機
對筆記本電腦、臺式機、工作站及其它不一直開機的系統很重要
對偶爾要關機的服務器很有用
配置文件:/etc/anacrontab ,負責執行/etc/ cron.daily
/etc/cron.weekly /etc/cron.monthly 中系統任務。
/etc/cron.hourly/ 由/cron.d/0hourly 執行
字段1 :如果在這些日子里沒有運行這些任務……
字段2 :在重新引導后等待這么多分鐘后運行它
字段3 :任務識別器,在日志文件中標識
字段4 :要執行的任務
當執行任務時,更新/var/spool/anacron/ 中文件的時間戳
管理臨時文件
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|create configfile
計劃任務
用戶cron: :
crontab 命令定義,每個用戶都有專用的cron 任務文件:
/var/spool/cron/USERNAME
crontab 命令:
crontab [-u user] [-l | -r | -e] [-i]
-l: 列出所有任務;
-e: 編輯任務;
-r: 移除所有任務;
-i :同-r 一同使用,以交互式模式移除指定任務
-u user: 僅root 可運行,指定用戶管理cron 任務
控制用戶執行計劃任務 :
/etc/cron.{allow,deny}
allow是白名單,dengy是黑名單
以下不包含root用戶
白名單優先級高于黑名單
當白名單文件生成后,不在白名單的用戶都沒權限使用了
沒有白名單文件時,在黑名單的用戶都沒權限使用
如果白名單和黑名單文件都不存在,則是任何人都沒權限使用
at和crontab比較
一次性作業使用at
重復性作業使用crontab
備注:沒有被重定向的輸出或被mail給用戶
root用戶能夠修改其他用戶的作業
運行結果的標準輸出和錯誤會以郵件的通知給相關用戶
1.command > /dev/null
2.command &> /dev/null
對于cron任務來講,%有特殊用途;如果在命令中要使用%,需要轉義;但是如果把%放置在單引號中,
可以不用轉義。
練習
1 、每天的2 點和12 點整,將/etc 備份至/testdir/backup目錄中,保存的文件名稱格式為“etcbak-yyyy-mm-dd-HH.tar.xz”
使用crontab -e命令 編輯,輸入命令
0 2,12 * * * /usr/bin/tar -Jcf /testdir/backup/etcbak-`date +\%F-%\d`.tar.xz /etc/
2 、每周2, 4, 7 備份/var/log/messages 文件至/logs 目錄中,文件名形如“messages-yyyymmdd”
使用crontab -e命令 編輯,輸入命令
0 23 * * 2,4,7 /usr/bin/cp -a /var/log/messages /logs/messages-`date +\%Y\%m\%d`
3 、每兩小時取出當前系統/proc/meminfo 文件中以S 或M開頭的信息追加至/tmp/meminfo.txt 文件中
使用crontab -e命令 編輯,輸入命令
0 */2 * * * /usr/bin/grep "^[SM].*" /proc/meminfo >>/tmp/memuinfo.txt
4 、工作日時間,每10 分鐘執行一次磁盤空間檢查,一旦發現任何分區利用率高于80% ,就執行wall
使用crontab -e命令 編輯,輸入命令
*/10 * * * * /root/bin/test.sh
test.sh腳本如下
1 #!/bin/bash 2 3 disk=`df |grep "sd"|egrep -o "[[:digit:]]*%"|cut -d "%" -f1|sort -n|tail -n1` 4 5 [[ $dick -gt 80 ]]&&wall "dick will be full"
原創文章,作者:qiuwei,如若轉載,請注明出處:http://www.www58058.com/44654