1. 程式人生 > >Linux之進程管理,性能監控與計劃任務

Linux之進程管理,性能監控與計劃任務

顯示文件 sighup 簡介 top 錯誤 detail 常用選項 思考 midnight

進程管理

ps

ps [OPTION]...
常用選項

aux,-ef,-eFH,
-eo pid,tid,class,rtprio,ni,pri,psr,pcpu,stat,comm
axo stat,euid,ruid,tty,tpgid,sess,pgrp,ppid,pid,pcpu,comm

選項:默認顯示當前終端中的進程

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 axo pid,%cpu,%mem,cmd k -%mem 內存利用率從大到小排序

ps axo pid,cmd user,ruser,nice,pri
renice -n -10 8814 更改8814進程nice優先級為-10,優先級越高,cpu會先分時間片,運行此進程。
nice -n -5 ping 127.0.0.1 以nice值我為-5運行ping命令

ps 輸出屬性

VSZ: Virtual memory SiZe,虛擬內存集,線性內存
RSS: ReSident Size, 常駐內存集
STAT:進程狀態

R:running
S: interruptable sleeping
D: uninterruptable sleeping
T: stopped
Z: zombie
+: 前臺進程

l: 多線程進程
L:內存分頁並帶鎖
N:低優先級進程
<: 高優先級進程
s: session leader,會話(子進程)發起者

ni: nice值

pri: priority 優先級
psr: processor CPU編號
rtprio: 實時優先級

ps示例

查詢你擁有的所有進程

ps -x

顯示指定用戶名(RUID)或用戶ID的進程

ps -fU apache
ps -fU 48

顯示指定用戶名(EUID)或用戶ID的進程

ps -fu wang
ps -fu 1000

查看以root用戶權限(實際和有效ID)運行的每個進程

ps -U root -u root

列出某個組擁有的所有進程(實際組ID:RGID或名稱)

ps -fG nginx

列出有效組名稱(或會話)所擁有的所有進程

ps -fg mysql
ps -fg 27

顯示指定的進程ID對應的進程

ps -fp 1234

以父進程ID來顯示其下所有的進程,如顯示父進程為1234的所有進程

ps -f --ppid 1234

顯示指定PID的多個進程

ps -fp 1204,1239,1263

要按tty顯示所屬進程

ps -ft pts/0

自定義格式顯示文件系統組,ni值開始時間和進程的時間

ps -p 1234 -o pid,ppid,fgroup,ni,lstart,etime

使用其PID查找進程名稱:

ps -p 1244 -o comm=

要以其名稱選擇特定進程,顯示其所有子進程

ps -C sshd,bash

查找指定進程名所有的所屬PID,在編寫需要從std輸出或文件讀取PID的腳本時這個參數很有用

ps -C httpd,sshd -o pid=

檢查一個進程的執行時間

ps -eo comm,etime,user | grep nginx

查找占用最多內存和CPU的進程

ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem | head
ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%cpu | head

顯示安全信息
ps -eM
ps --context

使用以下命令以用戶定義的格式顯示安全信息

ps -eo euser,ruser,suser,fuser,f,comm,label

使用watch實用程序執行重復的輸出以實現對就程進行實時的監視,如下面的命令顯示每秒鐘的監視

watch -n 1 ‘ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem | head‘

搜索進程



最靈活 ps 選項| 其他命令
按預定義的模式:pgrep
pgrep [options] pattern

-u uid: effective user,生效者
-U uid: real user,真正發起運行命令者
-t terminal: 與指定終端相關的進程
-l: 顯示進程名
-a: 顯示完整格式的進程名
-P pid: 顯示指定進程的子進程
示例

pgrep -lU wang
pgrep -at pts/3

按確切的程序名稱: /sbin/pidof

pidof bash

系統工具



/proc/uptime 包括兩個值,單位 s

系統啟動時長,空閑進程的總時長(按總的CPU核數計算)

uptime 和 w

顯示當前時間,系統已啟動的時間、當前上線人數,系統平均負載(1、5、10分鐘的平均負載,一般不會超過1)

系統平均負載:

1,指在特定時間間隔內運行隊列中的平均進程數
2,通常每個CPU內核的當前活動進程數不大於3,那麽系統的性能良好。如果每個CPU內核的任務數大於5,那麽此主機的性能有嚴重問題
3,如果linux主機是1個雙核CPU,當Load Average 為6的時候說明機器已經被充分使用

top:有許多內置命令(epel源裏htop工具更為好用)

排序:

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:虛擬機偷走的時間

選項:

-d # 指定刷新時間間隔,默認為3秒
-b 全部顯示所有進程
-n # 刷新多少次後退出
-H 線程模式,示例:top -H -p pidof mysqld

htop命令:EPEL源

選項:

-d #: 指定延遲時間;
-u UserName: 僅顯示指定用戶的進程
-s COLUME: 以指定字段進行排序

子命令:

s:跟蹤選定進程的系統調用
l:顯示選定進程打開的文件列表
a:將選定的進程綁定至某指定CPU核心
t:顯示進程樹

內存空間
free [OPTION]

-b 以字節為單位
-m 以MB為單位
-g 以GB為單位
-h 易讀格式
-o 不顯示-/+buffers/cache行
-t 顯示RAM + swap的總和
-s n 刷新間隔為n秒
-c n 刷新n次後即退出

內存工具



vmstat命令:虛擬內存信息
vmstat [options] [delay [count]]
vmstat 2 5 兩秒刷新 一共刷新5次
技術分享圖片
如上圖顯示的si和so,bi和bo參考物都是內存
如dd if=/dev/zero of=/dev/null bs=5G 內存不夠的話,會使用swap,此時so就會出現暴增,從內存出到swap
如dd if=dev/sda of=/dev/null 此時是從硬盤讀取數據到內存,數據進入內存,所以bi會出現暴增,
如dd if=dev/zero of=f1,此時要從內存讀數據寫入磁盤,出內存,所以bo會出現暴增。

系統監控工具



iostat:統計CPU和設備IO信息
示例:iostat 1 10
技術分享圖片

iftop:顯示帶寬使用情況,EPEL源
示例:iftop -n -i eth1 如果不加-n 不進行反解 顯示為主機名 否則顯示為IP
技術分享圖片

pmap命令:進程對應的內存映射

tip:可以用來刷鍋,如果開發人員開發的程序有bug,可以使用pmap查看是否有內存增長異常的模塊鏈接庫

pmap [options] pid [...]

-x: 顯示詳細格式的信息
示例:pmap 1

另外一種實現

cat /proc/PID/maps

glances命令:EPEL源(可以監控遠程主機,c/s架構)
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的相關數據單獨顯示

技術分享圖片

dstat命令:系統資源統計,代替vmstat,iostat
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: 顯示延遲最大的進程

iotop(可用於查看哪個軟件大量占用io)
iotop命令是一個用來監視磁盤I/O使用狀況的top類工具iotop具有與top相似的UI,其中包括PID、用戶、I/O、進程等相關信息,可查看每個進程是如何使用IO
iotop輸出

第一行:Read和Write速率總計
第二行:實際的Read和Write速率
第三行:參數如下:
線程ID(按p切換為進程ID)
優先級
用戶
磁盤讀速率
磁盤寫速率
swap交換百分比
IO等待所占的百分比
線程/進程命令

-o, --only只顯示正在產生I/O的進程或線程,除了傳參,可以在運行過程中按o生效
-b, --batch非交互模式,一般用來記錄日誌
-n NUM, --iter=NUM設置監測的次數,默認無限。在非交互模式下很有用
-d SEC, --delay=SEC設置每次監測的間隔,默認1秒,接受非×××數據例如1.1
-p PID, --pid=PID指定監測的進程/線程
-u USER, --user=USER指定監測某個用戶產生的I/O
-P, --processes僅顯示進程,默認iotop顯示所有線程
-a, --accumulated顯示累積的I/O,而不是帶寬
-k, --kilobytes使用kB單位,而不是對人友好的單位。在非交互模式下,腳本編程有用
-t, --time 加上時間戳,非交互非模式
-q, --quiet 禁止頭幾行,非交互模式,有三種指定方式

-q 只在第一次監測時顯示列名
-qq 永遠不顯示列名
-qqq 永遠不顯示I/O匯總

交互按鍵

left和right方向鍵:改變排序
r:反向排序
o:切換至選項--only
p:切換至--processes選項
a:切換至--accumulated選項
q:退出
i:改變線程的優先級

nload 查看網絡實時吞吐量
nload是一個實時監控網絡流量和帶寬使用情況,以數值和動態圖展示進出的流量情況
安裝:yum -y install nload (EPEL源)
界面操作

上下方向鍵、左右方向鍵、enter鍵或者tab鍵都就可以切換查看多個網卡的流量情況
按 F2 顯示選項窗口
按 q 或者 Ctrl+C 退出 nload

示例:

nload:默認只查看第一個網絡的流量進出情況
nload eth0 eth1:在nload後面指定網卡,可以指定多個

設置刷新間隔:默認刷新間隔是100毫秒,可通過 -t命令設置刷新時間(單位是毫秒)

nload -t 500 eth0

設置單位:顯示兩種單位一種是顯示Bit/s、一種是顯示Byte/s,默認是以Bit/s,也可不顯示/s

-u h|b|k|m|g|H|B|K|M|G 表示的含義: h: auto, b: Bit/s, k: kBit/s, m: MBit/s, H: auto, B: Byte/s, K: kByte/s, M: MByte/s
nload -u M eth0

lsof:list open files查看當前系統文件的工具。
在linux環境下,一切皆文件,用戶通過文件不僅可以訪問常規數據,還可以訪問網絡連接和硬件如傳輸控制協議 (TCP) 和用戶數據報協議 (UDP)套接字等,系統在後臺都為該應用程序分配了一個文件描述符
命令參數

-a:列出打開文件存在的進程
-c<進程名>:列出指定進程所打開的文件
-g:列出GID號進程詳情
-d<文件號>:列出占用該文件號的進程
+d<目錄>:列出目錄下被打開的文件
+D<目錄>:遞歸列出目錄下被打開的文件
-n<目錄>:列出使用NFS的文件
-i<條件>:列出符合條件的進程(4、6、協議、:端口、 @ip )
-p<進程號>:列出指定進程號所打開的文件
-u:列出UID號進程詳情
-h:顯示幫助信息
-v:顯示版本信息。
-n: 不反向解析網絡名字

進程管理

查看由登陸用戶啟動而非系統啟動的進程

lsof /dev/pts/1

指定進程號,可以查看該進程打開的文件

lsof -p 9527

文件管理

查看指定程序打開的文件

lsof -c httpd

查看指定用戶打開的文件

lsof -u root | more

查看指定目錄下被打開的文件

lsof +D /var/log/
lsof +d /var/log/
參數+D為遞歸列出目錄下被打開的文件,參數+d為列出目錄下被打開的文件

查看所有網絡連接

lsof -i –n
lsof [email protected]
通過參數-i查看網絡連接的情況,包括連接的ip、端口等以及一些服務的連接情況,例如:sshd等。也可以通過指定ip查看該ip的網絡連接情況

查看端口連接情況

lsof -i :80 -n
通過參數-i:端口可以查看端口的占用情況,-i參數還有查看協議,ip的連接情況等

查看指定進程打開的網絡連接

lsof -i –n -a -p 9527
參數-i、-a、-p等,-i查看網絡連接情況,-a查看存在的進程,-p指定進程

查看指定狀態的網絡連接

lsof -n -P -i TCP -s TCP:ESTABLISHED
-n:no host names, -P:no port names,-i TCP指定協議,-s指定協議狀態通過多個參數可以清晰的查看網絡連接情況、協議連接情況等

lsof示例
恢復刪除文件 :(前提是被別人誤刪除,並且你正在占用查看這個文件,才可以找到)

lsof |grep /var/log/messages
rm -f /var/log/messages
lsof |grep /var/log/messages
cat /proc/653/fd/6
cat /proc/653/fd/6 > /var/log/messages

進程管理工具

kill命令:向進程發送控制信號,以實現對進程管理,每個信號對應一個數字,信號名稱以SIG開頭(可省略),不區分大小寫
顯示當前系統可用信號: kill –l 或者 trap -l

常用信號: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

按PID:kill [-SIGNAL] pid …

kill –n SIGNAL pid
kill –s SIGNAL pid

按名稱:killall [-SIGNAL] comm…

killall -9 bash 強制殺死一系列進程

killall -0 bash = pidof bash 可用作檢查程序運行是否正常,根據$?的返回值。

按模式:pkill [options] pattern

-SIGNAL
-u uid: effective user,生效者
-U uid: real user,真正發起運行命令者
-t terminal: 與指定終端相關的進程
pkill -9 -t pts/1 強制殺死pts/1上的進程
-l: 顯示進程名(pgrep可用)
-a: 顯示完整格式的進程名(pgrep可用)
-P pid: 顯示指定進程的子進程

作業管理

Linux的作業控制

前臺作業:通過終端啟動,且啟動後一直占據終端
後臺作業:可通過終端啟動,但啟動後即轉入後臺運行(釋放終端)

讓作業運行於後臺

(1) 運行中的作業: Ctrl+z
(2) 尚未啟動的作業: COMMAND &

後臺作業雖然被送往後臺運行,但其依然與終端相關;退出終端,將關閉後臺作業。如果希望送往後臺後,剝離與終端的關系

nohup COMMAND &>/dev/null &
screen;COMMAND

查看當前終端所有作業:jobs

作業控制:

fg [[%]JOB_NUM]:把指定的後臺作業調回前臺
bg [[%]JOB_NUM]:讓送往後臺的作業在後臺繼續運行
kill [%JOB_NUM]: 終止指定的作業

技術分享圖片

並行運行

同時運行多個進程,提高效率
方法1

vi all.sh
f1.sh&
f2.sh&
f3.sh&

方法2

(f1.sh&);(f2.sh&);(f3.sh&)

方法3

{ f1.sh& f2.sh& f3.sh& }

任務計劃

Linux任務計劃、周期性任務執行
?未來的某時間點執行一次任務

at 指定時間點,執行一次性任務
batch 系統自行選擇空閑時間去執行此處指定的任務

?周期性運行某任務

cron

at 命令:at [option] TIME
常用選項:

-V 顯示版本信息
-t time 時間格式 [[CC]YY]MMDDhhmm[.ss]
-l 列出指定隊列中等待運行的作業;相當於atq
-d 刪除指定的作業;相當於atrm
-c 查看具體作業任務
-f /path/file 指定的文件中讀取任務
-m 當任務被完成之後,將給用戶發送郵件,即使沒有標準輸出
註意:作業執行命令的結果中的標準輸出和錯誤以郵件通知給相關用戶
TIME:定義出什麽時候進行 at 這項任務的時間
HH:MM [YYYY-mm-dd]
noon, midnight, teatime(4pm)
tomorrow
now+#{minutes,hours,days, OR weeks,year}

示例:
在今日的 HH:MM 進行,若該時刻已過,則明天此時執行任務

HH:MM 02:00

規定在某年某月的某一天的特殊時刻進行該項任務

HH:MM YYYY-MM-DD 02: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 min
02pm + 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 命令

周期性任務計劃cron
相關的程序包:
cronie:主程序包,提供crond守護進程及相關輔助工具
cronie-anacron:cronie的補充程序,用於監控cronie任務執行狀況,如cronie中的任務在過去該運行的時間點未能正常運行,則anacron會隨後啟動一次此任務
crontabs:包含CentOS提供系統維護任務
詳情參見 man 5 crontab
技術分享圖片
確保crond守護處於運行狀態:
CentOS 7:
systemctl status crond
CentOS 6:
service crond status
計劃周期性執行的任務提交給crond,到指定時間會自動運行
系統cron任務:系統維護作業

/etc/crontab

用戶cron任務:

crontab命令

日誌:/var/log/cron
例如:晚上9點10分運行echo命令

10 21 * wang /bin/echo "Howdy!"

每分鐘檢測httpd服務運行是否正常,不正常則重啟

* * * * * killall -0 httpd &> /dev/null || systemctl restart httpd

時間表示法:
?(1) 特定值
給定時間點有效取值範圍內的值
?(2) *
給定時間點上有效取值範圍內的所有值
表示“每...”
?(3) 離散取值
#,#,#
?(4) 連續取值
#-#
?(5) 在指定時間範圍上,定義步長
/#: #即為步長

系統的計劃任務:

/etc/crontab 配置文件
/etc/cron.d/ 配置文件
/etc/cron.hourly/ 腳本
/etc/cron.daily/ 腳本
/etc/cron.weekly/ 腳本
/etc/cron.monthly/ 腳本

[Sat Apr 06 22:10
 [email protected] /var/spool/at]$ ls /etc/cron
cron.d/       cron.daily/   cron.deny     cron.hourly/  cron.monthly/ crontab       cron.weekly/  
[Sat Apr 06 22:09
 [email protected] /var/spool/at]$ cat /etc/cron.d/0hourly 
# Run the hourly jobs
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
01 * * * * root run-parts /etc/cron.hourly

跑全部文件夾下的腳本

run-parts /Path/to/document

anacron系統
此文件/etc/anacrontab,定義了如果自動任務沒有執行,開機後每天開機後5分鐘,每周的第七天開機25分鐘,每月的開機第45分鐘執行自動任務腳本。

[Sat Apr 06 22:17
 [email protected] /var/spool/at]$ cat /etc/anacrontab
 # /etc/anacrontab: configuration file for anacron

# See anacron(8) and anacrontab(5) for details.

SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# the maximal random delay added to the base delay of the jobs
RANDOM_DELAY=45
# the jobs will be started during the following hours only
START_HOURS_RANGE=3-22

#period in days   delay in minutes   job-identifier   command
1       5       cron.daily              nice run-parts /etc/cron.daily
7       25      cron.weekly             nice run-parts /etc/cron.weekly
@monthly 45     cron.monthly            nice run-parts /etc/cron.monthly

字段1:如果在這些日子裏沒有運行這些任務……
字段2:在重新引導後等待這麽多分鐘後運行它
字段3:任務識別器,在日誌文件中標識
字段4:要執行的任務
由/etc/cron.hourly/0anacron執行
當執行任務時,更新/var/spool/anacron/cron.daily 文件的時間戳

管理臨時文件
CentOS7使用systemd-tmpfiles-setup服務實現
CentOS6使用/etc/cron.daily/tmpwatch定時清除臨時文件
配置文件:
/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

用戶計劃任務
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}

註意:如果在命令中要使用%,則需要轉義,將%放置於單引號中,則可不用轉義

技術分享圖片

思考:
(1) 如何在秒級別運行任務?
* * * * * for min in 0 1 2; do echo "hi"; sleep 20; done
(2) 如何實現每7分鐘運行一次任務?
sleep命令:
sleep NUMBER[SUFFIX]...

SUFFIX:
s: 秒, 默認
m: 分
h: 小時
d: 天

usleep 1000000 相當於1秒鐘,1000相當於1毫秒

Linux之進程管理,性能監控與計劃任務