- 進(jìn)程相關(guān)概念
- 系統(tǒng)進(jìn)程管理工具
- 任務(wù)計(jì)劃
一、進(jìn)程相關(guān)概念
定義:進(jìn)程(Process)是運(yùn)行中的程序的一個(gè)副本,是被載入內(nèi)存的一個(gè)指令集合
進(jìn)程ID(PID, Process ID):標(biāo)記每個(gè)進(jìn)程的編號(hào)
task struct: Linux內(nèi)核存儲(chǔ)進(jìn)程信息的數(shù)據(jù)結(jié)構(gòu)格式
task list: 多個(gè)任務(wù)的的task struct組成的鏈表
-
進(jìn)程創(chuàng)建:
- 第一個(gè)進(jìn)程:init(CentOS 6), systemd(CentOS 7)
- 子進(jìn)程由父進(jìn)程創(chuàng)建:CoW,子進(jìn)程只在發(fā)生變化時(shí)才擁有獨(dú)立內(nèi)存空間
-
進(jìn)程優(yōu)先級(jí):
- 系統(tǒng)優(yōu)先級(jí):0-139,數(shù)字越小優(yōu)先級(jí)越高
- 實(shí)時(shí)優(yōu)先級(jí):99-0,數(shù)字越大優(yōu)先級(jí)越高,對(duì)應(yīng)系統(tǒng)優(yōu)先級(jí)0-99
- nice優(yōu)先級(jí):-20-19,數(shù)字越小優(yōu)先級(jí)越高,對(duì)應(yīng)系統(tǒng)優(yōu)先級(jí)100-139
- 實(shí)時(shí)優(yōu)先級(jí)屬于靜態(tài)優(yōu)先級(jí),高優(yōu)先級(jí)進(jìn)程釋放CPU后低優(yōu)先級(jí)進(jìn)程運(yùn)行
- nice優(yōu)先級(jí)屬于動(dòng)態(tài)優(yōu)先級(jí),系統(tǒng)內(nèi)核會(huì)根據(jù)進(jìn)程對(duì)CPU的占用情況動(dòng)態(tài)調(diào)整各進(jìn)程的優(yōu)先級(jí),使每個(gè)進(jìn)程都能夠均勻使用CPU資源
Big O:時(shí)間復(fù)雜度,用時(shí)和規(guī)模的關(guān)系
O(1),O(logn), O(n)線性, O(n^2)拋物線,O(2^n),復(fù)雜度逐漸升高-
進(jìn)程內(nèi)存:
- Page Frame:內(nèi)存存儲(chǔ)單位為頁(yè)面(page),默認(rèn)大小4KB
- LRU:Least Recently Used 近期最少使用算法,釋放內(nèi)存使用
- 物理地址空間和線性地址空間
MMU (Memory Management Unit):負(fù)責(zé)轉(zhuǎn)換線性和物理地址
TLB (Translation Lookaside Buffer):翻譯后備緩沖器,用于保存虛擬地址和物理地址映射關(guān)系的緩存
-
IPC (Inter Process Communication) 進(jìn)程間通訊
- 同一主機(jī)
shm(shared memory):共享內(nèi)存空間
semaphore:信號(hào)量,一種計(jì)數(shù)器,保證一個(gè)進(jìn)程使用資源時(shí)其他進(jìn)程不能對(duì)資源進(jìn)行修改 - 不同主機(jī)
rpc (remote procedure call):遠(yuǎn)程過程調(diào)用
socket:通過IP和端口號(hào)通信
- 同一主機(jī)
Linux內(nèi)核:搶占式多任務(wù),將CPU的工作時(shí)間分片,不同進(jìn)程輪流使用CPU資源
-
進(jìn)程類型
- 守護(hù)進(jìn)程(daemon):在系統(tǒng)引導(dǎo)過程中啟動(dòng)的進(jìn)程,和終端無關(guān)
- 前臺(tái)進(jìn)程:通過終端啟動(dòng)的進(jìn)程,和終端相關(guān)
- 守護(hù)進(jìn)程與前臺(tái)進(jìn)程可以相互轉(zhuǎn)化
-
進(jìn)程狀態(tài)
- 運(yùn)行態(tài)(running)
- 就緒態(tài)(ready)
- 睡眠態(tài)(sleeping):分為可中斷(interruptable)和不可中斷(uninterruptable)
- 停止態(tài)(stopped):暫停于內(nèi)存,但不會(huì)被調(diào)度,除非手動(dòng)啟動(dòng)
- 僵死態(tài)(zombie):結(jié)束進(jìn)程,父進(jìn)程結(jié)束前,子進(jìn)程不關(guān)閉
進(jìn)程分為:
CPU密集型 (CPU bonding):進(jìn)程涉及大量CPU運(yùn)算
IO密集型 (IO bonding):進(jìn)程涉及大量讀寫操作
二、系統(tǒng)進(jìn)程管理工具
- Linux系統(tǒng)狀態(tài)的查看及管理工具:pstree, ps, pidof, pgrep, top, htop, glance, pmap, vmstat, dstat, kill, pkill, job, bg, fg, nohup
(一)pstree:打印進(jìn)程樹
- 選項(xiàng):
-p 顯示PID
-n 以PID數(shù)字大小排序,默認(rèn)字母排序 - 內(nèi)容中由大括號(hào)括起的為線程
- 進(jìn)程包含多個(gè)線程,線程間共享內(nèi)存
- 線程系統(tǒng)開銷小但穩(wěn)定性差,一個(gè)線程出錯(cuò)容易導(dǎo)致相鄰線程出錯(cuò)
- 進(jìn)程系統(tǒng)開銷大但穩(wěn)定性好,進(jìn)程間的內(nèi)存空間獨(dú)立,不會(huì)受到其他進(jìn)程干擾
(二)ps(process state):顯示當(dāng)前進(jìn)程狀態(tài)
進(jìn)程信息保存在/proc下以進(jìn)程ID命名的目錄中
語(yǔ)法:
ps [OPTION]...
-
支持三種風(fēng)格的選項(xiàng):
- UNIX選項(xiàng):有一個(gè)“-”充當(dāng)前綴,如-A -e
- BSD選項(xiàng):沒有前綴,如a
- GNU選項(xiàng):有兩個(gè)“-”充當(dāng)前綴,如--help
- 相同字母不同風(fēng)格的選項(xiàng)代表的意義不同,即a和-a是兩個(gè)不同意義的選項(xiàng)
選項(xiàng):
a選項(xiàng):包括所有終端中的進(jìn)程(默認(rèn)只顯示當(dāng)前終端中的進(jìn)程)
x選項(xiàng):包括不鏈接終端的進(jìn)程
u選項(xiàng):顯示進(jìn)程所有者的信息
f選項(xiàng):顯示進(jìn)程的父進(jìn)程
k|--sort:依照屬性排序
o選項(xiàng):顯示定制的信息
pid, comm(command name), %cpu, %mem, state, tty, euser(effective user), ruser(real user)
-C COMMAND 以命令搜索進(jìn)程輸出信息代號(hào):
VSZ(Virtual memory SiZe):虛擬內(nèi)存集,線性內(nèi)存,即系統(tǒng)聲明可以提供進(jìn)程使用的內(nèi)存
RSS(ReSident Size):常駐內(nèi)存集,即進(jìn)程實(shí)際使用的內(nèi)存
STAT:進(jìn)程狀態(tài)
R: running
S: interruptable sleeping
D: uninterruptable sleeping
T: stopped
Z: zombie
+: 前臺(tái)進(jìn)程
l: 多線程進(jìn)程
L:內(nèi)存分頁(yè)并帶鎖
N:低優(yōu)先級(jí)進(jìn)程
<: 高優(yōu)先級(jí)進(jìn)程
s: session leader,會(huì)話(子進(jìn)程)發(fā)起者-
常用選項(xiàng)組合:
- 常用組合1:-ef
-e: 顯示所有進(jìn)程
-f: 顯示完整格式程序信息 - 常用組合2:-eFH
-F: 顯示更完整格式的進(jìn)程信息
-H: 以進(jìn)程層級(jí)格式顯示進(jìn)程相關(guān)信息 - 常用組合:-o選項(xiàng)自定義輸出屬性
ps -eo pid,tid,class,rtprio,ni,pri,psr,pcpu,stat,comm
ps axo stat,euid,ruid,tty,tpgid,sess,pgrp,ppid,pid,pcpu,comm
ni:nice值,pri:priority優(yōu)先級(jí),psr:processor CPU編號(hào),rtprio:實(shí)時(shí)優(yōu)先級(jí)
- 常用組合1:-ef
(三)nice & renice:調(diào)整進(jìn)程優(yōu)先級(jí)
系統(tǒng)啟動(dòng)時(shí)默認(rèn)nice優(yōu)先級(jí)為0
只有root用戶可以降低nice值,提高進(jìn)程優(yōu)先級(jí)
nice命令:以指定nice值建立進(jìn)程
nice [OPTION] [COMMAND [ARG]...]
renice命令:調(diào)整進(jìn)程優(yōu)先級(jí)
renice [-n] priority pid...查看進(jìn)程nice值:
ps axo pid,comm,ni實(shí)驗(yàn):修改sshd進(jìn)程nice值
(四)pgrep:搜索進(jìn)程
語(yǔ)法:
pgrep [options] pattern
選項(xiàng):
-u uid: effective user,生效者
-U uid: real user,真正發(fā)起運(yùn)行命令者
-t terminal: 與指定終端相關(guān)的進(jìn)程
-l: 顯示進(jìn)程名
-a: 顯示完整格式的進(jìn)程名
-P pid: 顯示指定進(jìn)程的子進(jìn)程
以指定終端/dev/pts/1搜索相關(guān)進(jìn)程,以指定PIN2874搜索其子進(jìn)程
在hellopeiyang賬戶下執(zhí)行passwd命令。passwd命令發(fā)起者為hellopeiyang,但生效者為root用戶,此時(shí)-U選項(xiàng)下有passwd進(jìn)程,而-u選項(xiàng)下沒有passwd進(jìn)程。
- 按確切的程序名稱搜索PID:
pidof bash
(五)uptime
功能:顯示當(dāng)前時(shí)間,系統(tǒng)已啟動(dòng)的時(shí)間、當(dāng)前上線人數(shù),系統(tǒng)平均負(fù)載(1、5、10分鐘的平均負(fù)載,一般不會(huì)超過1)
系統(tǒng)平均負(fù)載:
指在特定時(shí)間間隔內(nèi)運(yùn)行隊(duì)列中的平均進(jìn)程數(shù)通常每個(gè)CPU內(nèi)核的當(dāng)前活動(dòng)進(jìn)程數(shù)不大于3,那么系統(tǒng)的性能良好。如果每個(gè)CPU內(nèi)核的任務(wù)數(shù)大于5,那么此主機(jī)的性能有嚴(yán)重問題
如果linux主機(jī)是1個(gè)雙核CPU,當(dāng)Load Average 為6的時(shí)候說明機(jī)器已經(jīng)被充分使用
當(dāng)前系統(tǒng)運(yùn)行正常
(六)top:linux進(jìn)程實(shí)時(shí)監(jiān)控
-
內(nèi)置命令:
- 排序:
P:按占據(jù)的CPU百分比,%CPU
M:按占據(jù)內(nèi)存百分比,%MEM
T:按累積占據(jù)CPU時(shí)長(zhǎng),TIME+ - 首部信息顯示:
uptime信息顯示/隱藏切換:l命令
tasks及cpu信息格式:t命令
cpu是否分別顯示:1 (數(shù)字)
memory信息格式:m命令 - 其他
退出命令:q
修改刷新時(shí)間間隔:s
終止指定進(jìn)程:k
保存文件:W
- 排序:
欄位信息簡(jiǎn)介
us:用戶空間
sy:內(nèi)核空間
ni:調(diào)整nice時(shí)間
id:空閑
wa:等待IO時(shí)間
hi:硬中斷
si:軟中斷(模式切換)
st:虛擬機(jī)偷走的時(shí)間選項(xiàng):
-d #:指定刷新時(shí)間間隔,默認(rèn)為3秒
-b:全部顯示所有進(jìn)程
-n #:刷新多少次后退出
- htop命令:EPEL源
- 選項(xiàng):
-d #:指定延遲時(shí)間;
-u UserName:僅顯示指定用戶的進(jìn)程
-s COLUME:以指定字段進(jìn)行排序 - 子命令:
s:跟蹤選定進(jìn)程的系統(tǒng)調(diào)用
l:顯示選定進(jìn)程打開的文件列表
a:將選定的進(jìn)程綁定至某指定CPU核心
t:顯示進(jìn)程樹
- 選項(xiàng):
(七)內(nèi)存監(jiān)控工具
(1)vmstat命令:虛擬內(nèi)存信息
- 語(yǔ)法:
vmstat [options] [delay [count]]
- 選項(xiàng):
-s: 顯示內(nèi)存的統(tǒng)計(jì)數(shù)據(jù)
vmstat 2 5
間隔2秒掃描一次,一共進(jìn)行5次
procs
r:可運(yùn)行(正運(yùn)行或等待運(yùn)行)進(jìn)程的個(gè)數(shù),和核心數(shù)有關(guān)
b:處于不可中斷睡眠態(tài)的進(jìn)程個(gè)數(shù)(被阻塞的隊(duì)列的長(zhǎng)度)memory
swpd:交換內(nèi)存的使用總量
free:空閑物理內(nèi)存總量
buffer:用于buffer的內(nèi)存總量
cache:用于cache的內(nèi)存總量swap(以內(nèi)存進(jìn)出為參照)
si:從磁盤交換進(jìn)內(nèi)存的數(shù)據(jù)速率(kb/s)
so:從內(nèi)存交換至磁盤的數(shù)據(jù)速率(kb/s)io(以內(nèi)存進(jìn)出為參照)
bi:從塊設(shè)備讀入數(shù)據(jù)到系統(tǒng)的速率(kb/s)
bo:保存數(shù)據(jù)至塊設(shè)備的速率system
in:interrupts 中斷速率,包括時(shí)鐘
cs:context switch 進(jìn)程切換速率cpu
us:運(yùn)行非內(nèi)核模式代碼消耗時(shí)間
sy:運(yùn)行內(nèi)核模式代碼消耗時(shí)間
id:空閑時(shí)間
wa:等待時(shí)間
st:虛擬機(jī)偷走的時(shí)間
(2)iostat:統(tǒng)計(jì)CPU和設(shè)備IO信息
iostat 2 5
間隔1秒掃描一次,一共進(jìn)行3次
(3)pmap命令:進(jìn)程對(duì)應(yīng)的內(nèi)存映射
- 語(yǔ)法:pmap [options] pid[...]
-x:顯示詳細(xì)格式的信息
pmap 1
顯示PID為1的進(jìn)程對(duì)應(yīng)的內(nèi)存映射
另外一種實(shí)現(xiàn):
cat /proc/PID/mapsll /proc/PID/fd | wc -l 監(jiān)控進(jìn)程的文件描述符數(shù)量,如果一直上升,則可能出現(xiàn)內(nèi)存泄漏
(八)系統(tǒng)監(jiān)控工具
(1)glances:系統(tǒng)監(jiān)控,可跨主機(jī)監(jiān)控
EPEL源
內(nèi)建命令:
a //默認(rèn)進(jìn)程排序
c //按照CPU占用對(duì)進(jìn)程排序
m //按照內(nèi)存占用對(duì)進(jìn)程排序
p //按照名稱對(duì)進(jìn)程排序
i //按照I/O使用對(duì)進(jìn)程排序
d //顯示/隱藏I/O統(tǒng)計(jì)
f //顯示/隱藏文件系統(tǒng)統(tǒng)計(jì)
n //顯示/隱藏網(wǎng)絡(luò)統(tǒng)計(jì)
s //顯示/隱藏傳感器統(tǒng)計(jì)
y //顯示/隱藏硬盤緩存統(tǒng)計(jì)
l //顯示/隱藏日志
b //以Byte或bit為單位顯示網(wǎng)絡(luò)I/O
w //刪除報(bào)警日志
x //刪除報(bào)警和危險(xiǎn)日志
1 //顯示全局CPU或CPU每個(gè)核心統(tǒng)計(jì)
h //顯示/隱藏幫助
t //查詢網(wǎng)絡(luò)I/O總體統(tǒng)計(jì)
u // 查詢網(wǎng)絡(luò)I/O累計(jì)統(tǒng)計(jì)
q //退出,也可以使用Esc或Ctrl+C
- 常用選項(xiàng)
-b //以Byte為單位顯示網(wǎng)卡數(shù)據(jù)速率
-d //關(guān)閉磁盤I/O模塊
-f /path/to/somefile //設(shè)定輸入文件位置
-o {HTML|CSV} //輸出格式
-m //禁用mount模塊
-n //禁用網(wǎng)絡(luò)模塊
-t # //延遲時(shí)間間隔
-1 //每個(gè)CPU的相關(guān)數(shù)據(jù)單獨(dú)顯示
- C/S模式下運(yùn)行g(shù)lances命令
- 服務(wù)器模式:
glances -s -B IPADDR
IPADDR: 指明監(jiān)聽的本機(jī)哪個(gè)地址 - 客戶端模式:
glances -c IPADDR
IPADDR:要連入的服務(wù)器端地址
- 服務(wù)器模式:
(2)dstat:系統(tǒng)資源統(tǒng)計(jì),代替vmstat, iostat
- 語(yǔ)法:
dstat [-afv] [options..] [delay [count]]
- 選項(xiàng):
-c:顯示cpu相關(guān)信息
-d:顯示disk相關(guān)信息
-g:顯示page相關(guān)統(tǒng)計(jì)數(shù)據(jù)
-m:顯示memory相關(guān)統(tǒng)計(jì)數(shù)據(jù)
-n:顯示network相關(guān)統(tǒng)計(jì)數(shù)據(jù)
-p:顯示process相關(guān)統(tǒng)計(jì)數(shù)據(jù)
-r:顯示io請(qǐng)求相關(guān)的統(tǒng)計(jì)數(shù)據(jù)
-s:顯示swap相關(guān)的統(tǒng)計(jì)數(shù)據(jù)
--top-cpu:顯示最占用CPU的進(jìn)程
--top-io: 顯示最占用io的進(jìn)程
--top-mem: 顯示最占用內(nèi)存的進(jìn)程
--top-latency: 顯示延遲最大的進(jìn)程
(九)kill, killall, pkill:進(jìn)程管理工具
(1)kill:向進(jìn)程發(fā)送信號(hào),按PID標(biāo)識(shí)進(jìn)程
語(yǔ)法:
kill -n SIGNAL pid
kill -s SIGNAL pid
kill -SIGNAL pid
信號(hào):通過信號(hào)對(duì)進(jìn)程進(jìn)行管理,信號(hào)名稱(不分大小寫)以SIG開頭(可省略),并且對(duì)應(yīng)一個(gè)數(shù)字
查詢系統(tǒng)可用信號(hào):
kill -l
或trap -l
常用信號(hào)(全部信號(hào)信息,查詢man 7 signal):
- SIGHUP:無須關(guān)閉進(jìn)程而讓其重讀配置文件
- SIGINT:中止正在運(yùn)行的進(jìn)程;相當(dāng)于Ctrl+c
- SIGQUIT:相當(dāng)于ctrl+\
- SIGKILL:強(qiáng)制殺死正在運(yùn)行的進(jìn)程
- SIGTERM:終止正在運(yùn)行的進(jìn)程
- SIGCONT:繼續(xù)運(yùn)行
- SIGSTOP:后臺(tái)休眠
- 指定信號(hào)的描述方法:
- 信號(hào)數(shù)字表示:如1
- 信號(hào)全程:如SIGHUP
- 信號(hào)簡(jiǎn)稱:如HUP
(2)killall:向進(jìn)程發(fā)送信號(hào),按名稱標(biāo)識(shí)進(jìn)程
語(yǔ)法:
killall [-SIGNAL] comm…
檢查進(jìn)程是否正常工作
killall -0 httpd //信號(hào)0的作用為檢查進(jìn)程是否正常運(yùn)行,之后可以echo $?判斷
killall -0 httpd || service httpd restart //若httpd進(jìn)程沒有正常運(yùn)行,則重啟httpd服務(wù)
- 如圖所示:
紅框1:表示信號(hào)1(SIGHUP)沒有關(guān)閉進(jìn)程,父PID沒有變化,但由于重新讀取了配置文件,子PID發(fā)生了變化
紅框2和紅框3:表示信號(hào)0的作用只是確認(rèn)進(jìn)程是否正常工作,當(dāng)進(jìn)程正常工作時(shí),發(fā)送信號(hào)0所有進(jìn)程的PID都沒有發(fā)生變化
紅框4:當(dāng)進(jìn)程結(jié)束后,發(fā)送信號(hào)0時(shí)返回結(jié)果為假,根據(jù)圖中的命令重啟了httpd進(jìn)程,顯然所有PID都與原進(jìn)程的PID不同
(3)pkill:向進(jìn)程發(fā)送信號(hào),按模式標(biāo)識(shí)進(jìn)程
- 語(yǔ)法:
pkill [options] pattern
- 選項(xiàng)
-SIGNAL:信號(hào)
-u:effective user,生效者
-U:real user,真正發(fā)起運(yùn)行命令者
-t:與指定終端相關(guān)的進(jìn)程
-P:顯示指定進(jìn)程的子進(jìn)程
(十)作業(yè)管理
前臺(tái)作業(yè):通過終端啟動(dòng),始終占據(jù)終端
后臺(tái)作業(yè):不一定從終端啟動(dòng),不占據(jù)終端而轉(zhuǎn)至后臺(tái)運(yùn)行
-
作業(yè)控制:
- 使作業(yè)運(yùn)行于后臺(tái):
(1)尚未運(yùn)行:COMMAND &
(2)前臺(tái)作業(yè)切換至后臺(tái):Ctrl+Z
- 查看當(dāng)前終端的所有作業(yè):
jobs
- 使送往后臺(tái)的作業(yè)繼續(xù)運(yùn)行:
bg JobNums
或kill 18 pid
- 將后臺(tái)作業(yè)送至前臺(tái):
fg JobNums
- 終止指定作業(yè):
kill %JobNums
- 使作業(yè)運(yùn)行于后臺(tái):
-
如圖顯示前臺(tái)、后臺(tái)之間的切換關(guān)系
實(shí)驗(yàn):前后臺(tái)作業(yè)切換
使用Ctrl+Z將前臺(tái)作業(yè)切換至后臺(tái)睡眠模式,使用bg命令使后臺(tái)作業(yè)繼續(xù)運(yùn)行,可以看到這個(gè)過程中icmp_seq是連續(xù)的,證明后臺(tái)作業(yè)只是曾經(jīng)睡眠,沒有終止
后臺(tái)作業(yè)運(yùn)行后,顯示運(yùn)行過程,但仍可以向終端中輸入命令,如圖中紅框表示:計(jì)劃輸入命令fg 1,執(zhí)行fg 1后作業(yè)轉(zhuǎn)至前臺(tái),終端被占用而無法輸入命令,最終Ctrl+C結(jié)束本作業(yè)
- 后臺(tái)作業(yè)仍舊依賴于終端,退出終端,后臺(tái)作業(yè)自動(dòng)結(jié)束。為使后臺(tái)作業(yè)與終端分離,可以使用以下命令:
nohup COMMAND &> /dev/null &
screen
COMMAND
斷開終端
screen -ls
screen -r
在screen下開啟ping進(jìn)程后,查看進(jìn)程樹發(fā)現(xiàn)ping進(jìn)程在screen進(jìn)程下
斷開終端后,重新恢復(fù)終端連接,查看進(jìn)程樹發(fā)現(xiàn)screen進(jìn)程沒有消失,而是自行變成了初始進(jìn)程的子進(jìn)程,而且PID沒有變化,證明原ping進(jìn)程沒有消失
此時(shí)通過screen命令重新進(jìn)入ping進(jìn)程,通過icmp_seq的數(shù)字也說明進(jìn)程在終端斷開期間沒有被關(guān)閉
- 并行運(yùn)行:同時(shí)運(yùn)行多個(gè)進(jìn)程,提高效率,有三種實(shí)現(xiàn)方式
- 方法1:適用于腳本中
f1.sh&
f2.sh&
f3.sh&
- 方法2
(f1.sh&);(f2.sh&);(f3.sh&)
- 方法3
{ f1.sh& f2.sh& f3.sh& }
- 方法1:適用于腳本中
三、任務(wù)計(jì)劃
(一)at:未來規(guī)定時(shí)間點(diǎn)執(zhí)行一次任務(wù)
依賴于atd服務(wù),需要啟動(dòng)才能實(shí)現(xiàn)at任務(wù):
service atd start (CentOS 6) 或 systemctl start atd (CentOS 7)語(yǔ)法:at [option] TIME
選項(xiàng):
-V:顯示版本信息
-l:列出指定隊(duì)列中等待運(yùn)行的作業(yè)
-d:刪除指定的作業(yè)
-c:查看具體作業(yè)任務(wù)
-f:/path/from/somefile:從指定的文件中讀取任務(wù)
-m:當(dāng)任務(wù)被完成之后,將給用戶發(fā)送郵件,即使沒有標(biāo)準(zhǔn)輸出
-
TIME:定義運(yùn)行任務(wù)的時(shí)間
- HH:MM [YYYY-mm-dd]:指定準(zhǔn)確時(shí)間(當(dāng)僅指定HH:MM時(shí),若今日時(shí)間已過,自動(dòng)在明天指定時(shí)刻運(yùn)行任務(wù))
- noon, midnight, teatime(4pm), tomorrow:約定俗成的時(shí)間命名
- now+#{minutes,hours,days, OR weeks}:以某個(gè)時(shí)間點(diǎn)為參照確定時(shí)間
執(zhí)行方式:
(1) 交互式
依次輸入命令,以Ctrl+d或Ctrl+\結(jié)尾
at命令的輸出結(jié)果以郵件形式發(fā)送到郵箱,如
紅框中郵件內(nèi)容,顯示at定義于當(dāng)天16:10進(jìn)行的ntpdate同步時(shí)間任務(wù)成功完成
(2) 輸入重定向,例如
echo "echo haha" | at TIME
at TIME << eof
(3) 從文件導(dǎo)入,at -f FILE TIME
- at隊(duì)列存放在/var/spool/at目錄中
- /etc/at.{allow,deny}控制用戶是否能執(zhí)行at任務(wù)
- 白名單:/etc/at.allow默認(rèn)不存在,只有該文件中的用戶才能執(zhí)行at命令
- 黑名單:/etc/at.deny默認(rèn)存在,拒絕該文件中用戶執(zhí)行at命令,不在at.deny文件中的使用者可執(zhí)行
- 如果兩個(gè)名單中都有同一個(gè)用戶,白名單的優(yōu)先級(jí)高于黑名單,即只看白名單設(shè)置
- 如果兩個(gè)文件都不存在,只有root可以執(zhí)行at命令
(二)cron:周期性執(zhí)行任務(wù)
相關(guān)的程序包:
cronie:主程序包,提供crond守護(hù)進(jìn)程及相關(guān)輔助工具
cronie-anacron:cronie的補(bǔ)充程序,用于監(jiān)控cronie任務(wù)執(zhí)行狀況,如cronie中的任務(wù)在過去應(yīng)該運(yùn)行的時(shí)間點(diǎn)未能正常運(yùn)行,則anacron會(huì)隨后啟動(dòng)一次此任務(wù)
crontabs:包含CentOS提供系統(tǒng)維護(hù)任務(wù)查看crond守護(hù)進(jìn)程運(yùn)行狀態(tài)
service crond status (CentOS 6)
systemctl status crond (CentOS 7)-
cron任務(wù)分為系統(tǒng)任務(wù)與用戶任務(wù)
- 系統(tǒng)cron任務(wù)通常為系統(tǒng)維護(hù)作業(yè),通過編輯/etc/crontab文件設(shè)置,文件保存后設(shè)置即時(shí)生效
- 用戶cron任務(wù)使用命令
crontab
設(shè)置,即時(shí)生效
日志文件路徑:/var/log/cron
-
系統(tǒng)cron任務(wù)
- /etc/crontab文件設(shè)置格式:每個(gè)任務(wù)為一行信息,由7位關(guān)鍵詞組成(中間以空格分隔),前5位描述時(shí)間信息,第6位描述用戶名,第7位描述任務(wù)命令
- 前5位時(shí)間信息格式,注意:第1-4位所描述的時(shí)間與第5位所描述的時(shí)間取并集
第1位: minute 取值:0-59
第2位: hour 取值:0-23
第3位: day of month 取值:1-31
第4位: month 取值:1-12 (or names)
第5位: day of week 取值:0-7 (0 or 7 is Sun, or use names)
-
時(shí)間表示方式:
- 特定值:給定時(shí)間點(diǎn)有效取值范圍內(nèi)的值
- *:給定時(shí)間點(diǎn)上有效取值范圍內(nèi)的所有值,即“每分/小時(shí)/天/月/周幾”的含義
- #,#,#:離散取值
- #-#:連續(xù)取值
- /#:在指定時(shí)間范圍上,定義步長(zhǎng)
-
特殊的時(shí)間表示方式:
- @reboot 重啟后運(yùn)行
- @yearly 相當(dāng)于0 0 1 1 *
- @annually 相當(dāng)于0 0 1 1 *
- @monthly 相當(dāng)于0 0 1 * *
- @weekly 相當(dāng)于0 0 * * 0
- @daily 相當(dāng)于0 0 * * *
- @hourly 相當(dāng)于0 * * * *
-
系統(tǒng)的計(jì)劃任務(wù):
- /etc/crontab
- /etc/cron.d/ 配置文件
- /etc/cron.hourly/ 每小時(shí)運(yùn)行腳本
- /etc/cron.daily/ 每日運(yùn)行腳本
- /etc/cron.weekly/ 每周運(yùn)行腳本
- /etc/cron.monthly/ 每月運(yùn)行腳本
實(shí)驗(yàn):每月的15日、30日以及每周五執(zhí)行計(jì)劃任務(wù):同步網(wǎng)絡(luò)主機(jī)172.18.0.1時(shí)間
編輯/etc/crontab文件如上圖
從日志文件可以看到,/etc/crontab文件保存后服務(wù)進(jìn)行了reload重載操作,此時(shí)計(jì)劃任務(wù)生效
ancron:運(yùn)行系統(tǒng)關(guān)機(jī)時(shí)未能運(yùn)行的任務(wù),CentOS 6后直接歸crond服務(wù)管理
-
管理臨時(shí)文件:
- CentOS6使用/etc/cron.daily/tmpwatch定時(shí)清除臨時(shí)文件
- CentOS7使用systemd-tmpfiles-setup服務(wù)實(shí)現(xiàn)
用戶cron任務(wù)
由crontab命令定義,每個(gè)用戶均在/var/spool/cron路徑有以其用戶名命名的專用任務(wù)文件
-
crontab命令:
- 語(yǔ)法:
crontab [-u user] [-l | -r | -e] [-i]
- 選項(xiàng):
-l:列出所有任務(wù)
-e:編輯任務(wù)
-r:移除所有任務(wù)
-i:同-r一同使用,以交互式模式移除指定任務(wù)
-u user:僅root可運(yùn)行,管理指定用戶cron任務(wù)
- 語(yǔ)法:
設(shè)置系統(tǒng)默認(rèn)編輯器為vim:export EDITOR=vim
編輯任務(wù):crontab -e
,任務(wù)描述格式與/etc/crontab文件格式類似,取消了用戶名
/var/spool/cron目錄下有以用戶名命名的任務(wù)文件
- 控制用戶執(zhí)行計(jì)劃任務(wù):
/etc/cron.{allow,deny}
控制方式參考at命令用戶控制配置文件/etc/at.{allow,deny}
當(dāng)在/etc/cron.deny文件中添加hellopeiyang用戶后,hellopeiyang用戶無法再使用crontab命令,但過去的計(jì)劃任務(wù)文件仍舊在/var/spool/cron目錄下,且可以繼續(xù)按計(jì)劃執(zhí)行
- 注意:
at和crontab運(yùn)行結(jié)果中的標(biāo)準(zhǔn)輸出和錯(cuò)誤會(huì)以郵件通知給相關(guān)用戶,使用重定向技術(shù)阻止郵件發(fā)送至用戶:
COMMAND &> /dev/null
對(duì)于cron任務(wù)來講,%有特殊用途;如果在命令中要使用%,則需要轉(zhuǎn)義,將%放置于單引號(hào)中,則可不用轉(zhuǎn)義