進程和計劃任務
一、 進程
程序:是在磁盤上的一個文件,只要不去運行它就是一個靜態文件,不占用內存空間;
進程:process是一個動態的概念,只有當用戶將程序運行起來時才會有進程,當進程執行完畢時,就會從內存中刪除。
線程:thread?? pstree –p 命令顯示中{}中的即為線程。
一個進程會對應一個程序,而一個程序可能會對應多個進程。
一個進程里至少有一個線程。
?
進程ID(Process ID,PID)號碼被用來標記各個進程
除了PID還有一些額外信息,例如:UID(誰運行了這個程序)、GID(運行者所屬主組)、和SELinux語境決定對文件系統的存取和訪問權限
task struct(任務結構):存放了進程的必要信息;(PID,UID,GID,SELinux)每個進程都有一個struct。
task list:多個任務的的task struct組成的鏈表
系統中的第一個進程 :init(Centos6)
system(Centos7)
fork(生成子進程), clone(生成子進程以及兄弟進程)都可以用來生成下一級的子進程。
在生成進程時為了優化空間一般來說都會采用CoW(Copy on Write 寫時復制)機制;
進程的狀態:創建、就緒、阻塞、執行、終止。
創建狀態:進程在創建時需要申請一個空白PCB(process control block進程控制塊),向其中填寫控制和管理進程的信息,完成資源分配。如果創建工作無法完成,比如資源無法滿足,就無法被調度運行,把此時進程所處狀態稱為創建狀態
?? 就緒狀態:進程已準備好,已分配到所需資源,只要分配到CPU就能夠立即運行
?? 執行狀態:進程處于就緒狀態被調度后,進程進入執行狀態
?? 阻塞狀態:正在執行的進程由于某些事件(I/O請求,申請緩存區失?。┒鴷簳r無法運行,進程受到阻塞。在滿足請求時進入就緒狀態等待系統調用
?? 終止狀態:進程結束,或出現錯誤,或被系統終止,進入終止狀態。無法再執行
進程優先級:
系統優先級:數字越小,優先級越高
0-139(CentOS4,5)
各有140個運行隊列和過期隊列 (同級的運行隊列中若任務全部完成,則過期隊列轉化為同級的運行隊列)
0-98,99(CentOS6)
實時優先級: 99-0 值最大優先級最高
nice值:-20到19,對應系統優先級100-139或99
Big O:時間復雜度,用時和規模的關系。
進程內存:
Page Frame: 頁框,用存儲頁面數據,存儲Page 4k
LRU:Least Recently Used 近期最少使用算法,釋放內存 ,存放緩存數據的基本算法。
內存空間:物理地址空間和線性地址空間
MMU:Memory Management Unit(內存處理單元)負責轉換線性和物理地址
TLB:Translation Lookaside Buffer (翻譯后備緩沖器)用于保存虛擬地址和物理地址映射關系的緩存
IPC: Inter Process Communication (進程間通訊)
同一主機: signal:信號
shm: shared memory (共享內存)
semaphore:信號量,一種計數器 ,表示資源是否可用
不同主機:socket: IP和端口號
RPC: remote procedure call (遠程過程調用)
MQ:消息隊列,Kafka,ActiveMQ
進程類型:
守護進程(后臺執行): daemon,在系統引導過程中啟動的進程,和終端無關進程
前臺進程(前臺執行):跟終端相關,通過終端啟動的進程,占用終端資源
進程狀態:
運行態:running
就緒態:ready
睡眠態:
可中斷:interruptable
不可中斷:uninterruptable
停止態:stopped,暫停于內存,但不會被調度,除非手動啟動
僵死態:zombie,結束進程,父進程結束前,子進程不關閉
R:running
S: interruptable sleeping
D: uninterruptable sleeping
T: stopped
Z: zombie
+: 前臺進程
l: 多線程進程
L:內存分頁并帶鎖
N:低優先級進程
<: 高優先級進程
s: session leader,會話(子進程)發起者
進程的分類:
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? 顯示詳細的進程樹
ps: process state 顯示進程狀態,基于快照,即當時瞬間狀態,默認顯示當前這一個用戶的前臺進程。(不包括后臺進程以及與終端無關的進程)
Linux系統各進程的相關信息均保存在/proc/PID目錄下的各文件中
ps支持三種選項:
UNIX選項 如-A -e
BSD選項 如a
GNU選項 如—help
選項:ps默認顯示當前終端中的進程
ps? a 選項包括所有終端中的進程
x 選項包括不鏈接終端的進程
u 選項顯示進程所有者的信息
f 選項顯示進程樹,相當于 –forest
k|–sort 屬性 對屬性排序,屬性前加- 表示倒序
o 屬性… 選項顯示定制的信息 pid、cmd、%cpu、%mem
L 顯示支持的屬性列表
-C cmdlist 指定命令,多個命令用,分隔
?? -L 顯示線程
?-e: 顯示所有進程,相當于-A
?? -f: 顯示完整格式程序信息
?? -F: 顯示更完整格式的進程信息
?? -H: 以進程層級格式顯示進程相關信息
?? -u userlist 指定有效的用戶ID或名稱
?? -U userlist 指定真正的用戶ID或名稱
?-g gid或groupname 指定有效的gid或組名稱
?? -G gid或groupname 指定真正的gid或組名稱
?-p pid 顯示指pid的進程
?–ppid pid 顯示屬于pid的子進程
?-M 顯示SELinux信息,相當于Z
ps xo ni: nice值
???? pri: priority 優先級
???? psr: processor CPU編號
???? rtprio: 實時優先級
使用watch實用程序執行重復的輸出以實現對就程進行實時的監視,如下面的命令顯示每秒鐘的監視:
watch -n 1 ‘ps -eo pid,ppid,cmd,%mem,%cpu –sort=-%mem | head’
renice命令: 可以調整進程nice優先級。
renice [-n] priority pid…
例:renice? -n? -10? 2162????? 將2162號進程nice優先級調為-10
nice命令: 可以指定程序的優先級運行。
nice [OPTION] [COMMAND [ARG]…]
例:nice –n -5 cmd???? 以-5的優先級運行cmd程序
nice -5 cmd???????? 以5的優先級運行cmd程序
nice –5 cmd??????? 以-5的優先級運行cmd程序
按預定義的模式搜索進程: pgrep [options] pattern (支持正則表達式)
pgrep?? -u uid: effective user,生效者
-U uid: real user,真正發起運行命令者
-t terminal: 與指定終端相關的進程
-l: 顯示進程名
-a: 顯示完整格式的進程名
-P pid: 顯示指定進程的子進程
按確切的程序名稱搜索進程:pidof
例:pidof? bash????? 顯示bash進程的PID
uptime
顯示當前時間,系統已啟動的時間、當前上線人數,系統平均負載(指在特定時間間隔內運行隊列中的平均進程數)。
load overage? ____1____? ____2____? ____3____
1.1分鐘內的平均負載
2.5分鐘內的平均負載
3.10分鐘內的平均負載
注:平均負載值一般不會超過1
?
top: ???動態觀察進程
輸入? P:以占據的CPU百分比,%CPU 排序
M:占據內存百分比,%MEM 排序
T:累積占據CPU時長,TIME+ 排序
q: 退出觀察界面
s: 修改刷新時間間隔
k:終止指定進程
l:首部信息顯示uptime信息
t:首部信息顯示tasks及cpu信息
1(數字一):首部信息顯示cpu分別顯示
m:首部信息顯示memory信息
W:保存文件
top ??-d # 指定刷新時間間隔為#秒,默認為3秒
-b??? 全部顯示所有進程
-n #? 刷新#次后退出
htop命令:EPEL源
htop -d #: 指定延遲時間;
-u UserName: 僅顯示指定用戶的進程
-s COLUME: 以指定字段進行排序
s: 跟蹤選定進程的系統調用
l: 顯示選定進程打開的文件列表
a:將選定的進程綁定至某指定CPU核心
t: 顯示進程樹
free [OPTION]:顯示內存空間使用狀態
free -b 以字節為單位
-m 以MB為單位
-g 以GB為單位
-h 易讀格式
-o 不顯示-/+buffers/cache行
-t 顯示RAM + swap的總和
-s n 刷新間隔為n秒
-c n 刷新n次后即退出
vmstat命令:查看虛擬內存信息 ,默認執行完就退出,也可以通過加數字來動態觀察。
例:vmstat 2 5????? 2秒執行命令一次,執行5次后退出
io:?? bi:從塊設備讀入數據到系統的速率(kb/s)
bo: 保存數據至塊設備的速率
swap: si:從磁盤交換進內存的數據速率(kb/s)
so:從內存交換至磁盤的數據速率(kb/s)
iostat:統計CPU和設備IO信息
pmap命令:顯示進程對應的內存映射關系
pmap –x? 顯示詳細的信息
臟數據:正在修改尚未結束的數據
glances命令:EPEL源 ,遠程監控遠程主機上的狀態。
dstat命令:系統資源統計,代替vmstat,iostat
dstat -c: 顯示cpu相關信息
-d: 顯示disk相關信息
-g:顯示page相關統計數據
-m: 顯示memory相關統計數據
-n: 顯示network相關統計數據
-p: 顯示process相關統計數據
-r: 顯示io請求相關的統計數據
-s: 顯示swapped相關的統計數據
–top-cpu:顯示最占用CPU的進程
–top-io: 顯示最占用io的進程
–top-mem: 顯示最占用內存的進程
?–top-latency: 顯示延遲最大的進程
iotop命令是一個用來監視磁盤I/O使用狀況的top類工具
kill命令: 向進程發送控制信號,以實現對進程管理,每個信號對應一個數字,信號名稱以SIG開頭(可省略),不區分大小寫
查看常用信號:man 7 signal
1) SIGHUP: 無須關閉進程而讓其重讀配置文件
2) SIGINT: 中止正在運行的進程;相當于Ctrl+c
3) SIGQUIT:相當于ctrl+\
9) SIGKILL: 強制殺死正在運行的進程
15) SIGTERM:終止正在運行的進程
18) SIGCONT:繼續運行
19) SIGSTOP:后臺休眠
指定信號的方法:
(1) 信號的數字標識:1, 2, 9
(2) 信號完整名稱:SIGHUP
(3) 信號的簡寫名稱:HUP
killall (-15) sleep?? 殺死同樣名字為sleep的程序。(killall默認為15號信號)
pkill [options] pattern(支持正則表達式)
-SIGNAL(信號編號)
-u uid: effective user,生效者
-U uid: real user,真正發起運行命令者
-t terminal: 與指定終端相關的進程
-l: 顯示進程名(pgrep可用)
-a: 顯示完整格式的進程名(pgrep可用)
-P pid: 顯示指定進程的子進程
作業管理:
查看當前終端所有作業:jobs
將命令從前臺執行改為后臺執行:cmd? &
將#號命令從后臺放回前臺:fg? #
將前臺命令放入后臺,但會使命令處于休眠狀態:ctrl + z
將#號命令從休眠狀態恢復到運行狀態:bg? #
關閉#號命令:kill? %#
后臺作業雖然被送往后臺運行,但其依然與終端相關;退出終端,將關閉后臺作業。如果希望送往后臺后,剝離與終端的關系
nohup COMMAND &>/dev/null &
screen;COMMAND(創建會話)
多進程并行執行:
方法一:編寫腳本
vi all.sh
f1.sh&
f2.sh&
f3.sh&
方法二:
(f1.sh&);(f2.sh&);(f3.sh&)
方法三:
{ f1.sh& f2.sh& f3.sh& }
二、任務管理
未來的某時間點執行一次任務:at
周期性運行某任務:cron
執行一次任務:
at? -V 顯示版本信息:
-l: 列出指定隊列中等待運行的作業;相當于atq
-d: 刪除指定的作業;相當于atrm
-c: 查看具體作業任務
-f /path/from/somefile:從指定的文件中讀取任務
-m:當任務被完成之后,將給用戶發送郵件,即使沒有標準輸出
at的時間格式:
??at now + #minutes??? 15分鐘后執行命令
at 02pm + 3day?????? 三天后的下午2點執行命令
noon, midnight, teatime(4pm)
tomorrow
now+#{minutes,hours,days, OR weeks}
白名單:/etc/at.allow 默認不存在,只有該文件中的用戶才能執行at命令
黑名單:/etc/at.deny 默認存在,拒絕該文件中用戶執行at命令,而沒有在at.deny 文件中的使用者則可執行
如果兩個文件都不存在,只有 root 可以執行 at 命令
若兩個文件都存在則只有在白名單的用戶才可以使用at命令
周期性運行任務:
確保crond守護處于運行狀態:
CentOS 7:
systemctl status crond
CentOS 6:
service crond status
系統cron任務:vim? /etc/crontab
# .—————- 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
分 時 日 月 周幾 執行人? 命令
*/10?? 每10分鐘執行一次
‘日’和‘周幾’時“或”的關系
@monthly??? 每個月一號0點執行任務
@reboot???? 每次啟動系統時執行任務
@yearly???? 每年一月一日0點執行任務
@daily ?????每天0點執行任務
@hourly???? 每個小時0分執行任務
@weekly???? 每周日0點執行任務
crontab ??-l: 列出所有任務
-e: 編輯任務
-r: 移除所有任務
-i:同-r一同使用,以交互式模式移除指定任務
-u user: 僅root可運行,指定用戶管理cron任務
控制用戶執行計劃任務:
/etc/cron.{allow,deny}??????? (與at的黑白名單相同)
注:可以利用sleep命令達到秒級運行任務。
例:vim? f1.sh
cmd
sleep? 20
cmd
sleep? 20???????????????????? 實現了每20秒執行一次任務
cmd
vim? /etc/crontab
* * * * * f1.sh
sleep命令:
sleep NUMBER[SUFFIX]…
SUFFIX:
s: 秒, 默認
m: 分
h: 小時
d: 天
本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/97567