進程管理:
什么是進程?
在Linux系統當中:觸法任何一個事件時,系統都會將它定義成為一個進程,并且給予這個進程一個ID,稱為PID,同時依據觸發這個進程的用戶與相關屬性關系,給予這個PID一組有效的權限設置。
進程與程序:
程序(program):通常為二進制程序放置在存儲媒介中,以物理文件的形式存在。
進程(process):程序被觸發后,執行者的權限與屬性、程序的程序代碼與所需數據等都會被加載到內存中,操作系統并給予這個內存內的單元一個標識符(PID),可以說,進程就是一個正在運行中的程序。
-
進程ID(Process ID,PID)號碼被用來標記各個進程
-
UID、GID、和SELinux語境決定對文件系統的存取和訪問權限,
-
通常從執行進程的用戶來繼承
-
存在生命周期
子進程與父進程:
子進程是由一個進程所產生的進程,產生這個子進程的進程稱為父進程;父進程終止子進程自然終止。
子進程與父進程之間的關系最大的復雜點在于進程相互之間的調用,在linux中的過程調用中通常稱為fork-and-exec的流程,進程都會通過父進程以復制的方式產生一個一模一樣的子進程,然后被復制出來的子進程再以exec的方式來執行實際要進行的進程,最終就成為一個子進程的存在。
進程的創建:
init:第一個進程
父子關系
進程:都由其父進程創建,
fork(), clone()
進程的優先級:
-
系統優先級:數字越小,優先級越高
0-139(CentOS4,5):各有140個運行隊列和過期隊列
0-98,99(CenOS6)
-
實時優先級:99-0:值最大優先級最高
-
Nice值:-20,19對應系統優先級100-139或99
進程的調度使用的算法不同,所用的時間有所不同,我們需要實現時間復雜度優化,最理想狀態為O(1)狀態,
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-display a tree of processes
pstree命令以樹狀圖的方式展現進程之間的派生關系,顯示效果比較直觀。
ps: process state:進程狀態
ps-report a snapshot of the current processes
Linux系統各進程的相關信息均保存在/proc/PID目錄下的各文件中
進程管理工具:
ps命令:ps命令用于報告當前系統的進程狀態??梢源钆鋕ill指令隨時中斷、刪除不必要的程序。ps命令是最基本同時也是非常強大的進程查看命令,使用該命令可以確定有哪些進程正在運行和運行的狀態、進程是否結束、進程有沒有僵死、哪些進程占用了過多的資源等等,總之大部分信息都是可以通過執行該命令得到的。
命令語法: ps [OPTION]…
支持三種格式選項:
UNIX選項 如 -a
BSD選項 如 a
GUN選項 如 –help
默認顯示當前終端中的進程
-
a選項包括所有終端中的進程
-
x選項包括不鏈接終端的進程
-
u選項顯示進程所有者的信息
-
f選項顯示進程的父進程
-
o屬性… 選項顯示定制的信息:pid(進程ID)、comm(進程命令)、%cpu(處理器)、%mem(內存)、stat(狀態)、tty(終端)、euser(有效用戶)、ruser(發起用戶)…
VSZ: Virtual memory SiZe,虛擬內存集,線性內存
RSS: ReSidentSize, 常駐內存集
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 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: 實時優先級
搜索進程:
最靈活:ps選項| 其它命令
按預定義的模式:pgrep
pgrep [options] patter
-u uid: effective user,生效者
-U uid: real user,真正發起運行命令者
-t terminal: 與指定終端相關的進程
-l: 顯示進程名
-a: 顯示完整格式的進程名
-P pid: 顯示父進程為此處指定的進程的進程列表
按確切的程序名稱:/sbin/pidof
$ pidofbash
系統工具
uptime:
顯示當前時間,系統已啟動的時間、當前上線人數,系統平均負載(1、5、10分鐘的平均負載,一般不會超過1)
系統平均負載:
指在特定時間間隔內運行隊列中的平均進程數。
如果每個CPU內核的當前活動進程數不大于3的話,那么系統的性能良好。如果每個CPU內核的任務數大于 5,那么這臺機器的性能有嚴重問題。
如果linux主機是1個雙核CPU的話,當Load Average 為6的時候說明機器已經被充分使用了。
進程管理工具:
top:有許多內置命令:
排序:
P:以占據的CPU百分比,%CPU
M:占據內存百分比,%MEM
T:累積占據CPU時長,TIME+
首部信息顯示:
uptime信息:l命令
tasks及cpu信息: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):任務所有者IDUSER (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命令:htop 是一個 Linux 下的交互式的進程瀏覽器,可以用來替換top命令。需從Fedora-EPEL源安裝
選項:
-d #: 指定延遲時間;
-u UserName: 僅顯示指定用戶的進程;
-s COLUME: 以指定字段進行排序;
子命令:
s: 跟蹤選定進程的系統調用;
l: 顯示選定進程打開的文件列表;
a:將選定的進程綁定至某指定CPU核心;
t: 顯示進程樹
vmstat命令:vmstat命令的含義為顯示虛擬內存狀態(“Viryual Memor Statics”),但是它可以報告關于進程、內存、I/O等系統整體運行狀態。
vmstat [options] [delay [count]]
選項:
-s: 顯示內存的統計數據
vmstat 2 5
procs:
r:等待運行的進程的個數,和核心數有關
b:處于不可中斷睡眠態的進程個數(被阻塞的隊列的長度)
memory:
swpd: 交換內存的使用總量
free:空閑物理內存總量
buffer:用于buffer的內存總量
cache:用于cache的內存總量
swap:
si:從磁盤交換進內存的數據速率(kb/s)
so:從內存交換至磁盤的數據速率(kb/s)
io:
bi:從塊設備讀入數據到系統的速率;(kb/s)
bo: 保存數據至塊設備的速率;
system:
in: interrupts, 中斷速率,包括時鐘
cs: context switch, 進程切換速率
cpu:
us:Timespent running non-kernel code.
sy: Time spent running kernel code
id: Time spent idle. Linux 2.5.41前,包括IO-wait time.
wa: Time spent waiting for IO. 2.5.41前,包括in idle.
st: Time stolen from a virtual machine. 2.6.11前, unknown.
pmap命令:進程的內存映射
pmap[options] pid[…]
-x: 顯示詳細格式的信息;
#pmap1
另外一種實現:
# cat /proc/PID/maps
系統監控工具:
Glances 是一個由 Python 編寫,使用 psutil 庫來從系統抓取信息的基于 curses 開發的跨平臺命令行系統監視工具。 通過 Glances,我們可以監視 CPU,平均負載,內存,網絡流量,磁盤 I/O,其他處理器 和 文件系統 空間的利用情況。
Glances 是一個用來監視 GNU/Linux 和 FreeBSD 操作系統的 GPL 授權的自由軟件。
Glances 同時也提供了很多實用的選項。 其中我們能夠在配置文件見到的一項主要的功能就是設置關鍵值及相應的標簽 (careful[小心], warning[警告] 和 critical[嚴重]), 然后她會自動幫我們用不同顏色標出系統達到某個瓶頸的信息。
glances命令:EPEL源
命令語法:
glances [-bdehmnrsvyz1] [-B bind] [-c server] [-C conffile] [-p port] [-P password] [–password] [-t refresh] [-f file] [-o output]
常用選項:
-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命令是一個全能系統信息統計工具。擁有一個彩色的界面,在手動觀察性能狀況時,數據比較顯眼容易觀察;而且dstat支持即時刷新,如輸入dstat 3即每三秒收集一次,但最新的數據都會每秒刷新顯示。dstat也可以收集指定的性能資源,如dstat -c即顯示CPU的使用情況。
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相關的統計數據
–top-cpu:顯示最占用CPU的進程
–top-io: 顯示最占用io的進程
–top-mem: 顯示最占用內存的進程
–top-latency: 顯示延遲最大的進程
進程管理工具
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
按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 &
此類后臺作業雖然被送往后臺運行,但其依然與終端相關;退出終端,將關閉后臺作業。如果希望送往后臺后,剝離與終端的關系:
# nohup COMMAND &
查看所有作業:
# jobs
作業控制:
# fg [[%]JOB_NUM]:把指定的后臺作業調回前臺;
# bg [[%]JOB_NUM]:讓送往后臺的作業在后臺繼續運行;
# kill [%JOB_NUM]:終止指定的作業;
進程優先級:
進程優先級調整:
靜態優先級:100-139
進程默認啟動時的nice值為0,優先級為120
只有根用戶才能降低nice值(提高優先性)
nice命令:
nice [OPTION] [COMMAND [ARG]…]
renice命令:
renice[-n] priority pid…
查看:
psaxopid,comm,ni
任務計劃:
Linux任務計劃、周期性任務執行
未來的某時間點執行一次任務:at, batch
周期性運行某任務: cron
at命令:
at [option] TIME
TIME:
HH:MM [YYYY-mm-dd]
noon, midnight, teatime
tomorrow
now+#{minutes,hours,days, OR weeks}
常用選項:
-q QUEUE:
-l: 列出指定隊列中等待運行的作業;相當于atq
-d: 刪除指定的作業;相當于atrm
-c: 查看具體作業任務
-f /path/from/somefile:從指定的文件中讀取任務
-m:強制at發送郵件,表示執行完畢
注意:作業執行命令的結果中的標準輸出和錯誤以郵件通知給相關用戶
例:
1、三天后的下午5點執行/bin/ls
:
[root@CentOS-6 ~]# at 5pm +3days at> /bin/ls at> <EOT> job 4 at 2016-09-14 17:00
2、明天17點鐘,輸出時間到指定文件內:
[root@CentOS-6 ~]# at 17:20 tomorrow at> date >/root/time.log at> <EOT> job 5 at 2016-09-12 17:20
3、計劃任務設定后,在沒有執行之前我們可以用atq命令來查看系統沒有執行工作任務:
[root@CentOS-6 ~]# atq 4 2016-09-14 17:00 a root 5 2016-09-12 17:20 a root
4、刪除已經設置的任務:
[root@CentOS-6 ~]# atq 4 2016-09-14 17:00 a root 5 2016-09-12 17:20 a root [root@CentOS-6 ~]# atrm 4 [root@CentOS-6 ~]# atq 5 2016-09-12 17:20 a root
5、顯示已經設置的任務內容:
[root@CentOS-6 ~]# at -c 5 #!/bin/sh # atrun uid=0 gid=0 # mail root 0 umask 22 ... 略 ... date >/root/time.log marcinDELIMITER26eb659b
batch命令:讓系統自行選擇空閑時間去執行此處指定的任務
batch命令進程和作業管理 batch命令用于在指定時間,當系統不繁忙時執行任務,用法與at相似。
語法
batch(選項)(參數)
選項
-f:指定包含具體指令的任務文件;
-q:指定新任務的隊列名稱;
-m:任務執行完后向用戶發送E-mail。
參數
日期時間:指定任務執行的日期時間。
實例
[root@CentOS-6 ~]# batch at> echo 123 at> <EOT> job 6 at 2016-09-11 11:20
周期性任務計劃:cron
相關的程序包:
-
cronie: 主程序包,提供crond守護進程及相關輔助工具
-
cronie-anacron:cronie的補充程序;用于監控cronie任務執行狀況;如cronie中的任務在過去該運行的時間點未能正常運行,則anacron會隨后啟動一次此任務
-
crontabs:包含CentOS提供系統維護任務
確保crond守護處于運行狀態:
CentOS 7:
systemctl status crond
…running…
CentOS 6:
service crond status
計劃周期性執行的任務提交給crond,到指定時間會自動運行,向crond提交作業的方式不同于at,它需要使用專用的配置文件,此文件有固定格式,不建議直接使用文本編輯器編輯此文件,使用crond命令編輯。
cron任務分為兩類:
系統cron任務:主要用于實現系統自身的維護;
手動編輯:/etc/crontab文件
用戶cron任務
命令:crontab命令
Crontab的基本組成:
系統cron的配置格式:/etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# For details see man 4 crontabs
注意:
①每一行定義一個周期性任務;共七個字段
* * * * * :定義周期性時間
user-name :運行任務的用戶身份
command to be executed:任務
②此處的環境變量不同于用戶登錄后獲得的環境,因此,建議命令使用絕對路徑,或自定義PATH變量。
③執行結果郵件發送給MAILTO指定的用戶
系統的計劃任務:
/etc/crontab
/etc/cron.d/ 配置文件
/etc/cron.hourly/ 腳本
/etc/cron.daily/腳本
/etc/cron.weekly/腳本
/etc/cron.monthly/腳本
用戶cron:
用戶cron的配置格式:/var/spool/cron/USERNAME
crontab命令定義,每個用戶都有專用的cron任務文件:/var/spool/cron/USERNAME
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# For details see man 4 crontabs
注意:
①每行定義一個cron任務,共六個字段;
②此處的環境變量不同于用戶登錄后獲得的環境,因此,建議命令使用絕對路徑,或自定義PATH變量。
③郵件發送給當前用戶;
crontab配置文件格式:
時間表示法:
①特定值:
給定時間點有效取值范圍內的值;
注意:day of week和 day of month 一般不同時使用;
②*
給定時間點上有效取值范圍內的所有值;表示“每..”
③離散取值;
在給定時間時間點上使用逗號分隔的多個值
#,#,#
④連續取值:-
在時間點上使用-連接開頭和結束
#-#
⑤在指定時間點上,定義步長: /
/#:#即步長
*/2:每兩分鐘
例如:每3小時echo命令;
0 */3 * * * gentoo/bin/echo "hello"
特別時間格式:
@reboot = Run once after reboot.
@yearly = 0 0 1 1 *
@annually = 0 0 1 1 *
@monthly = 0 0 1 * *
@weekly = 0 0 * * 0
@daily0 = 0 * * *
@hourly = 0 * * * *
注意:
(1)指定的時間點不能被步長整除時,其意義將不服存在;
(2)最小時間單位為“分鐘”,想完成“秒"任務:得需要額外借助于其他機制
定義每分鐘任務;而在利用腳本實現沒分鐘之內,循環執行多次;
示例:
1、 3 * * * * :每小時第三分鐘執行一次;
2、 3 4 * * * :每周任務;每周5的4點3分;
3、 5 6 7 * * :每月任務;每月的7號6點5分
4、 7 8 9 10 * :每年任務,每年的10月9號8點7分
5、 9 8 * * 3,7:每周三和周日;
6、 0 8,20 * *3,7:每周三和周日的8點和20點
7、 0 9-18 * * 1-5:周一至周五9-18點每小時執行一次
8、 */5 * * * *:每五分鐘執行一次任務
crontab命令:
crontab[-u user] [-l | -r | -e] [-i]
-l: 列出所有任務;
-e: 編輯任務;
-r: 移除所有任務;
-i:同-r一同使用,以交互式模式移除指定任務
-u user: 僅root可運行,指定用戶管理cron任務
注意:
運行結果的標準輸出和錯誤以郵件通知給相關用戶
(1) COMMAND > /dev/null
(2) COMMAND &> /dev/null
對于cron任務來講,%有特殊用途;如果在命令中要使用%,則需要轉義;不過,如果把%放置于單引號中,也可以不用轉義;
at和crontab
-
一次性作業使用at
-
重復性作業使用crontab
-
沒有被重定向的輸出會被郵寄給用戶
-
根用戶能夠修改其它用戶的作業
思考:如何在秒級別運行任務?
由于crontab最小時間單位為分鐘,所以我們需要借用sleep命令使其“睡一會”,來實現秒級別,及不能整除時間單位的計劃任務。
sleep命令:
sleep NUMBER [SUFFIX]…
SUFFIX:
s: 秒, 默認
m: 分
h: 小時
d: 天
如:每20秒執行一次
* * * * * for min in 0 1 2; do echo "hi"; sleep 20 ; done
練習
①每12小時備份一次/etc目錄至/backups目錄中,保存文件名稱格式為“/etc-yyyy-mm-dd-hh.tar.gz”
# crontab -e 0 */12 * * * tar -zcf /backups/etc-`date +\%F-\%H`.tar.gz /etc
②每周2,4,7備份/var/log/secure文件至/logs目錄中,文件名格式為“secure-yyyymmdd”;
# crontab -e * * * * 2,4,7 cp -r /var/log/secure /logs/secre-`date +\%F`
③每兩個小時取出當前系統/proc/meminfo文件中以S或M開頭的行信息追加至/tmp/meminfo.txt文件中;
# crontab -e 0 */2 * * * grep "^[SM].*"/proc/meminfo >> /tmp/meminfo.txt
④四月的第一個星期日早晨1點59分運行a.sh
# crontab -e 59 1 1-7 4 * test `date +\%w` -eq 0 && bash a.sh
⑤工作日時間,每10分鐘執行一次磁盤空間檢查,一旦發現任何分區利用率高于80%,就執行wall警報
# vim /testdir/disk.sh
#!/bin/bash a=`df | grep "^/dev/sd" | tr -s ' ' '%'| cut -d% -f5 | sort -n | tail -1` if [ $a -gt 80 ];then wall "The disk will be full" fi
# chmod +x disk.sh # crontab -e */10 * * * 1-5 /testdir/disk.sh
思考:某任務在指定的時間因關機未能執行,下次開機會不會自動執行?
不會!
如果期望某時間因故未能按時執行,下次開機后無論是否帶來相應的時間點都要執行一次,可使用anacron實現。
anacron系統:
運行計算機關機時cron不運行的任務,CentOS6.0以后版本取消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/文件時間戳
管理臨時文件:
rhel7.0之前使用tmpwatch工具定時清除臨時文件。
rhel7.0使用systemd-tmpfiles-setup服務實現
配置文件:
-
/etc/tmpfiles.d/*.conf
-
/run/tmpfiles.d/*.conf
-
/usr/lib/tmpfiles/*.conf
命令:
systemd -tmpfiles –clean|remove|create configfile
原創文章,作者:Groot,如若轉載,請注明出處:http://www.www58058.com/45881