1. 程式人生 > >第13章,進程和計劃任務

第13章,進程和計劃任務

linux linux進程管理 linux作業管理 linux計劃任務

更多內容請點擊:

Linux學習從入門到打死也不放棄,完全筆記整理(持續更新,求收藏,求點贊~~~~)

http://blog.51cto.com/13683480/2095439

第13章,進程和計劃任務

本章內容:

進程相關概念

進程及系統相關工具

計劃任務

進程概念:

內核的功用:進程管理、文件系統、網絡功能、內存管理、驅動程序、安全功能等

process: 運行中的程序的一個副本,是被載入內存的一個指令集合

進程ID(PID)號碼被用來標記各個進程

UID、GID、和SElinux語境決定對文件系統的存取和訪問權限

通常從執行進程的用戶來繼承

存在生命周期

task struct: Linux內核存儲進程信息的數據結構格式

task list: 多個任務的task struct組成的鏈表

進程創建:

init/systemd: 第一個進程

進程都是由其父進程創建, CoW 寫時復制機制

fork()生成子進程,clone()生成子進程或者兄弟進程

進程的基本狀態:

創建狀態:

進程在創建時需要申請一個空白PCB(process control block進程控制塊)

向其中填寫控制和管理進程的信息,完成資源分配。如果創建工作無法

完成,比如資源無法滿足,就無法被調度運行、把此時進程所處狀態稱為

創建狀態

就緒狀態:

進程已準備好,已分配到所需資源,只要分配到CPU舊能夠立即運行

執行狀態:

就緒狀態被調度後,進程進入執行狀態

阻塞狀態:

正在執行的進程由於某些事件(io請求,申請緩存區失敗)而暫時無法運行,

進程受到阻塞。在滿足請求時進入就緒狀態等待系統調用

終止狀態:

進程結束,或出現錯誤,或被系統終止,進入終止狀態,無法再執行

------ 許可 ------ 時間片完 ------ 釋放 ----

| 創建 | ————————>> | 就緒 |<<=============>>| 執行 |————————>> |終止|

------ ------ 進程調度 ------ ----

o | |

o | I/O完成 ------ I/O請求|

o <<————————| 阻塞 |<<————————

就緒狀態無法直接變成阻塞狀態,先執行

阻塞狀態無法直接變成執行狀態,先就緒

進程優先級:

系統優先級:

0-139 centos4 5

各有140個運行隊列和過期隊列

0-98,99 centos6

實時優先級:99-0 值越大優先級最高

nice值:-20到19,對應系統優先級100-139(centos45) 或99(centos6)

Big O:時間復雜度,用時和規模的關系

O(1),O(logn),O(n)線性,O(n^2)拋物線,O(2^n)

進程優先級調整:

靜態優先級:100-139

進程默認啟動時的nice值為0,優先級為120

只有root用戶才能降低nice值(提高優先級)

nice:

nice [option][cmd [arg]]

如:nice -n 10 vim & 將vim的優先級降低10

nice -n -15 vim 將vim的優先級提高15並執行

renice:

renice [-n] priority

如:

renice 0|5|-5 -p 93074 將pid為93074的ni 設為0|5|-5

renice 10 -u root 將用戶root的進程ni設置為10

進程相關概念:

進程內存:

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,僵死進程

進程分類:

CPU-Bound: cpu密集型,非交互,如加密解密

IO-Bound: IO密集型,交互

系統管理工具:

Linux系統狀態的查看及管理工具:

pstree,ps,pidof,top,htop,glance,pmap,vmstat,

dstat,kill,pkill,job,bg,fg,nohup

pstree:

pstree -p

Linux 系統各進程的相關信息均保存在/proc/PID目錄下的各文件中

ps:

ps [option]... 查看進程狀態信息

支持三種風格選項:

UNIX選項 -A -e

BSD選項 a u x

GNU選項 --help

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

a 所有終端中的進程

x|-x 所有非終端進程

u 顯示進程所有者的信息

f|--forest 顯示進程樹

k|--sort [-]屬性 對屬性排序,-表示倒序

centos6不支持%cpu %mem排序

o 屬性1,屬性2.. 指定需要顯示的信息

如:pid,cmd,%cpu,%mem

L 支持的屬性列表

-C cmd1,cmd2,.. 指定命令

-L 顯示線程

-e|-A 顯示所有進程

-f 顯示完成格式進程信息

-F 顯示更完整格式的進程信息

-H 以進程層級格式顯示進程相關信息

-u userlist 指定有效的用戶ID或名稱 euid

-U userlist 指定真正的用戶ID或名稱 ruid

-g gid或groupname 指定有效的gid或組 egid

-G gid或groupname ruid

-p pid 顯示pid的進程

--ppid pid 顯示pid的子進程信息

-M|Z 顯示SElinux的信息,相當於Z

-C cmd -o pid= 通過cmd查看pid

-p pid -o comm= 通過pid查看comm

alias ps1='ps xo user,pid,%cpu,%mem,vsz,rss,tty,stat,start,time,pri,nice,cmd'

輸出屬性:

VSZ: Virtual memmory size,虛擬內存集,線性內存

RSS: Rdsident Size, 常駐內存集,實際占用內存

STAT: 進程狀態

R: running

S: interrupttable sleeping 可中斷睡眠

D: uninterrupttable sleeping 不可中斷睡眠

T: stopped 停止

Z: zombie

+ 前臺進程

l 多線程進程

L 內存分頁並帶鎖

N 低優先級進程

< 高優先級進程

ni: nice值

pri: priority優先級

psr: processor CPU編號

rtprio: 實時優先級

示例:

ps axo pid,cmd,psr,ni,pri,rtprio

常用組合:

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

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

ps -fU apache

ps -fU 48

此處貌似用-u 也不錯,因為apache是系統用戶,結果一樣

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

ps -fu wang

ps -fu 1000

這裏用-U,結果就有可能不一樣了

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

ps -U root -u root

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

ps -fG nginx

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

ps -fg mysql

ps -fg 27

通過進程id來顯示所屬的進程:

ps -fp 1234

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

ps -f/l --ppid 1154

顯示中PID的多個進程

ps -lp 6507 6508 6509...

要按tty 顯示所屬進程

ps -lt pts/4

以進程樹顯示系統中的進程如何相互鏈接

ps -e --forest ps auxf

以進程樹顯示指定的進程

ps f -f -C sshd

ps -ef --forest |grep -v grep |grep sshd

要顯示一個進程的所有線程,將顯示LWP(輕量級進程)以及NLMP(輕量級進程數)列:

ps -fL -C httpd

要列出所有格式說明符:

ps L

查看進程的PID ppid 用戶名 和命令

ps -eo pid,ppid,user,cmd

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

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

使用其PID查找進程名稱

ps -p 1234 -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 watch -n 1 'ps -eo pid,ppid,cmd,%mem,%cpu f -mem%|head'

搜索進程:----------------------------------------------------------------

ps 選項 | grep等其他命令

按預定義的模式:pgrep

pgrep:

pgrep [options] pattern

-u uid euid,有效用戶為uid的所有進程 的pid

-U uid Ruid,真實用戶為uid的所有進程 的pid

-t termina 與指定終端相關的進程的pid

-l 顯示進程名

-a 顯示完成進程名(centos6 不支持)

-P pid 顯示指定進程的子進程

pidof 按確切的程序名稱查找

piodof /bin/bash

系統工具:---------------------------------------------------------

uptime:

顯示當前時間,系統已啟動的時間,當前上線人數,系統平均負載(1/5/10分鐘 )

系統平均負載:

在特定時間間隔內運行隊列中的平均進程數

通常每個cpu內核的當前活動進程數不大於3,那麽系統的性能良好。

如果每個cpu內核的任務數大於5,那麽次主機的性能有嚴重問題

如果linux主機是1個雙核cpu,當load Average = 6 ,說明機器已經被充分使用

進程管理工具:------------------------------------------------------------------

top:

內鍵命令:

排序:

p 以占據的cpu百分比,%cpu

M 占據內存百分比

T 累計占據cpu時間,TIME+

首部信息顯示:

l uptime信息

t tasks及cpu信息

1(數字) cpu分別顯示

m memory信息

退出命令 q

修改刷新時間間隔 s

終止指定進程 k

保存文件: W

顯示完成cmd c

欄位信息簡介

cpu:us 用戶空間,sy 內核空間,ni 調整nice時間,id 空閑時間

wa 等待IO時間,hi 硬中斷,si 軟中斷,st 被虛擬機偷走的時間

選線:

-d # 指定刷新時間間隔,默認為3s

-b 全部顯示所有進程

-n # 刷新多少次後退出

htop:

選項:

-d # 指定延遲時間

-u 僅顯示指定用戶的進程

-s COLUME 以指定字段進行排序

排序:P M T

s 跟蹤選定進程的系統調用

l 顯示選定進程打開的文件列表

a 將選定的進程綁定至某指定CPU核心

t 顯示進程數

k 結束進程

q 退出

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,2,9,15

信號的完成名稱 SIGHUP

信號的簡寫名稱 HUP

按PID:

kill [-signal] pid

kill -n HUP pid kill -s SIGHUP pid

按名稱:

killall [-signal] command

按模式:

pkill [options] pattern

-signal

-u uid euser為pid 的進程

-U uid ruser為pid 的進程

-t terminal 指定終端相關的進程

-l 顯示進程名

-P pid 指定進程的子進程

內存工具:-----------------------------------------------------------

free:

free [option] 查看內存空間使用狀態

-b 以字節為單位

-m 以MB為單位

-g 以GB為單位

-h human 易讀格式

-o 不顯示-/+ buffers/cache 行

-t 顯示RAM+swap 的總和

-s n 刷新時間為n秒

-c n 刷新n次後退出

vmstat:

vmstat [optins] [delay[count]] 虛擬內存以及磁盤io查詢

vmstat 2 5 表示2秒刷新一次,一共刷5次

-m 查看內存具體使用情況非常詳細

-s 內存統計信息

--help 使用幫助

信息顯示:

procs:

r 可運行(正在執行或等待運行)進程的個數,和核心數有關

b 處於不可中斷睡眠態的進程個數(被阻塞的隊列的長度)

memory

swpd 交換內存使用總量

free 空閑物理內存總量

buffers cache 用於buffer/cache的內存總量

swap

si 從磁盤交換進內存的數據速率(kb/s)

so 從內存交換至磁盤的數據速率(kb/s)

io

bi 從塊設備讀入數據到內存的速率(kb/s)

bo 保存數據至塊設備的速率

system

in: interrupts 中斷速率,包括時鐘

cs context switch 進程切換速率

cpu

us 用戶空間,sy 內核空間,id 空閑時間,wa 等待時間 st 偷走時間

iostat:

統計cpu和設備io信息

iostat 1 5 刷新顯示

pmap 進程對應的內存映射

pmap [options] pid..

-x 顯示詳細格式

如 pmap -x 1

另外一種實現:

cat /proc/pid/maps

系統監控工具-----------------------------------------------------------

glances:

glaces [-bdehmnrsvyz1] [-B bind] [-c server] [-C conffile] [-p port]

[-P password] [--password] [-t refresh] [-f file] [-o output]

內鍵命令:

排序: a 自動排序

c cpu%排序

m mem%排序

p 按名稱排序

i 按IO排序

u user排序

t network I/O

顯示/隱藏 左側窗口顯示

d disk 磁盤io信息

f file system stats,文件系統信息

n network stats 網絡信息

s Show/hide sensors stats

y Show/hide hddtemp stats

l Show/hide logs

其他:

b 網絡信息用bit為單位

w Delete warning logs

x Delete warning and critical logs

數字1 分別顯示單顆cpu

h help 幫助界面

q 退出

常用選線:

-b =b以byte為單位顯示網卡數據速率

-d d 關閉磁盤IO模塊

-f file 設定輸入文件位置

-t # 延遲時間間隔

C/S模式下雲心glances命令

服務器模式:

glances -s -B IP

客戶端模式:

glances -c IP

dstat:

系統資源統計,代替vmstat iostat

dstat [avf][options] [delay[count]]

例如:

dstat -av 3 5 3秒一次刷新 一共刷新5次

選項: -c cpu相關

-d disk相關

-g page相關

-m mem相關

-n net相關

-p proc相關

-r io 相關

-s swap相關

長選項

--tcp --udp --unix --raw --socket --ipc

--top-cpu

--top-io

--top-mem

--top-latency 延遲最大的進程

iotop:

用來監視磁盤I/O使用狀況的top類工具,具有與top相似的UI,其中包括

PID、用戶、IO、進程等相關信息,可查看每個進程是如果使用io

iotop輸出信息:

第一行: read 和write的速率總計

第二行: 實際的read和write速率

第三行:

TID/PID : 線程id,按p轉換為pid

PRIO: 優先級

USER: 用戶

DISK READ: 磁盤讀速度

DISK WRITE:磁盤寫速度

SWAPIN: swap使用百分比

COMMAND: 進程命令

選項:

-o --only 只顯示正在產生IO的進程, 運行中按o生效

-b --batch 非交互模式,一般用戶記錄日誌

-d # --delay= 刷新間隔默認1s 可以為小數 比如1.5

-n # --iter= 檢測次數,默認無限

-p PID --pid= 指定檢測的進程

-u USER --user= 指定檢測某個用戶產生的IO

-P --processes 僅顯示進程,默認iotop顯示所有線程

-a --accumulated 顯示累計的IO,而不是帶寬 交互a鍵

-k --kilobytes 使用KB單位

-t --time 加上時間戳,非交互式

-q --quit 禁止頭幾行,非交互式,有三種指定方式

-q 只在第一次檢測時顯示列名

-qq 永遠不顯示列名

-qqq 用戶不顯示i/o匯總

交互式按鍵:

r 反向排序

o 切換至選線only

p 切換至processes選線

a 速率/帶寬切換

q 退出

i 改變線程的優先級

作業管理--------------------------------------------------------------------

linux的作業控制:

前臺作業: 通過終端啟動,且啟動後一直占據終端

後臺作業: 可通過終端啟動,但啟動後即轉入後臺運行(釋放終端)

讓作業運行與後臺:

1 運行中的作業: ctrl+z

2 尚未啟動的作業 cmd &

後臺作業雖然被送往後臺運,但其依然與終端相關,退出終端,將關閉後臺作業

如果希望送往後臺後,剝離與終端的關系

nohup cmd &>/dev/null &

screen;cmd

查看當前終端所有作業:

jobs

作業控制:

fg [[%]num] 把指定的後臺作業調回前臺

bg [[%]num] 讓送往後臺的作業在後臺繼續運行

kill [%num] 終止指定的作業

並行運行:

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

方法1:

vim all.sh

f1.sh &

f2.sh &

f3.sh &

all.sh

方法2:

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

方法3:

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

計劃任務:

Linux任務計劃、周期性任務執行

未來的某個時間點執行一次任務

at

batch 系統自行選擇空閑時間去執行此處執行的任務

周期性運行某任務

cron

centos設置時間同步

需有一臺用於同步時間的服務器,提供同步IP

centos6:

vim /etc/ntp.conf

添加一行:

server IP iburst

chkconfig ntpd on

service ntpd star

ntpdate ip

centos7

vim /etc/chrony.conf

添加一行:server ip iburst

systemctl start chronyd

systemctl enable chronyd

ntpdate ip

at任務:

at [option] TIME

常用選項:

-V 顯示版本信息

-l 列出指定隊列中等待運行的作業,相當於atq

-d 刪除指定的作業,相當於atrm

-c 查看具體作業任務

-f file 從指定的文件中讀取任務

-m 當任務完成之後,將給用戶發送郵件,即使沒有標準輸出

註意:作業執行命令的結果中的標準輸出和標準錯誤以郵件通過給相關用戶

TIME: 定義出什麽時候進行at這項任務的時間

HH:MM [yyyy-mm-dd]

noon,midnight,teatime(4pm)

tomorrow

now+#{minutes,hours,days,weeks}

HH:MM 如 2:00

在今天2:00進行,若今天時間已過,則明天此時執行任務

HH:MM YYYY-MM-DD 如 2:00 2019-09-20

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

HH:MM [am|pm][Month] [date]

04pm March 17 3月17號下午4點

17:20 tomorrow 明天17.20

在某個時間點再加幾個時間後才進行該項任務

now + 5 minutes|min

02pm + 3 days 第一個下午2點之後在加3天

執行方式:

1 交互式

2 輸入重定向

3 at -f file

依賴於atd 服務,需要啟動才能實現at任務

at 隊列存放在/var/spool/at目錄中

權限控制:

/etc/at.{allow,deny},控制用戶是否能執行at任務

白名單/etc/at.allow 默認不存在,如果存在,只有該文件中的用戶才能執行at命令

黑名單/etc/at.deny 默認存在,

如果白名單存在,黑名單無效

如果白名單不存在,在除黑名單中之外的用戶可以使用at命令

如果兩個文件都不存在,只有root可以執行at命令

cron:

周期性任務計劃:cron

相關的程序包:

cronie:主程序包,提供crond守護進程及相關輔助工具

cronie-anacron:cronie的補充程序,用於監控cronie任務執行狀況,

如cronie中的任務在過去該運行的時間點未能正常運行,則anacron會

隨後啟動一起此任務

crontabs:包含centos提供系統維護服務

確保crond守護處於運行狀態:

centos7: systemctl status crond

centos6: service crond stadus

計劃周期性執行的任務提交給crond,到指定時間會自動運行

系統cron任務:系統維護作業

/etc/crontab

用戶cron任務:

crontab 命令

日誌:/var/log/cron

系統cron任務:/etc/crontab

時間格式: * * * * *

分(0-59) 小時(0-23) day(1-31) month(1-12) week(0-6 或者1-7,周天是0或者7)

時間表示法:

1 特定值: 給定時間點有效取值範圍內的值

2 * 每。。。

3 離散取值 #,#,#

4 連續取值 #-#

5 /# 指定步長,比如 0 /2 * * * 表示每2小時執行一次

特殊格式: @reboot 開機執行

@yearly 每年 = 0 0 1 1 *

@annually

@monthly

@weekly

@daily

@hourly

在etc下有相關腳本執行 /etc/cron.daily

/etc/cron.hourly

/etc/cron.monthly

/etc/cron.weekly

/etc/crontab

/usr/bin/run-parts dir 運行目錄下所有可執行腳本

anacron系統:

運行計算機關機時cron不運行的任務,centos6 以後版本取消anacron服務

有crond服務管理

用戶計劃任務:

crontab:

每個用戶都有專用的cron任務文件:/var/spool/cron/USERNAME

crontab [-u user] [-l|-r|-e][-i]

-l 列出所有任務

-e 編輯任務

-r 移除所有任務

-i 同-r 一同使用,以交互式模式移除指定任務

-u user 僅root 可以執行,指定用戶管理cron任務

控制用戶執行計劃任務

/etc/cron.allow

/etc/cron.deny

規則同at

註意事項:

運行結果的標準輸出和錯誤以郵件通知相關用戶

對於cron任務來講,%有特殊用途;如果在計劃任務命令中要使用%。需要轉義,

或者放置在單引號中(貌似無效)

或者將命令放在單獨腳本中,計劃任務中執行腳本即可

也可以將寫好的計劃任務腳本放在/etc/cron.d/ 下,系統自動執行

練習:

1、每周的工作日1:30,將/etc備份至/backup目錄中,保存的文件名稱格式

為“etcbak -yyyy-mm-dd-HH.tar.xz”,其中日期是前一天的時間

vim /root/bin/etcbackup.sh

#!/bin/bash

tar -Jcvpf /backup/etcbak-`date +%F-%H`.tar.xz /etc

chmod +x /root/bin/etcbackup.sh

crontab -e

30 1 * * 1-5 /root/bin/etcbackup.sh

2、每兩小時取出當前系統/proc/meminfo文件中以S或M開頭的信息追加至

/tmp/meminfo.txt文件中

crontab -e

0 */2 * * * cat /proc/meminfo|grep -Ei '^s|^m' >> /tmp/meminfo.txt

3、工作日時間,每10分鐘執行一次磁盤空間檢查,一旦發現任何分區利用率高

於80%,就執行wall警報

實驗作業:

添加@reboot root reboot 計劃任務之後修復




第13章,進程和計劃任務