20170822 進(jìn)程和計(jì)劃任務(wù)

  • 進(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)通信
  • 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í)

(三)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)程樹

(七)內(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/maps

  • ll /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ù)器端地址

(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 -ltrap -l

  • 常用信號(hào)(全部信號(hào)信息,查詢man 7 signal):

  1. SIGHUP:無須關(guān)閉進(jìn)程而讓其重讀配置文件
  2. SIGINT:中止正在運(yùn)行的進(jìn)程;相當(dāng)于Ctrl+c
  3. SIGQUIT:相當(dāng)于ctrl+\
  4. SIGKILL:強(qiáng)制殺死正在運(yùn)行的進(jìn)程
  5. SIGTERM:終止正在運(yùn)行的進(jìn)程
  6. SIGCONT:繼續(xù)運(yùn)行
  7. 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 JobNumskill 18 pid
    • 將后臺(tái)作業(yè)送至前臺(tái):fg JobNums
    • 終止指定作業(yè):kill %JobNums
  • 如圖顯示前臺(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)程下

screen2.png

斷開終端后,重新恢復(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& }

三、任務(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ù)

設(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í)行

  • 注意
  1. at和crontab運(yùn)行結(jié)果中的標(biāo)準(zhǔn)輸出和錯(cuò)誤會(huì)以郵件通知給相關(guān)用戶,使用重定向技術(shù)阻止郵件發(fā)送至用戶: COMMAND &> /dev/null

  2. 對(duì)于cron任務(wù)來講,%有特殊用途;如果在命令中要使用%,則需要轉(zhuǎn)義,將%放置于單引號(hào)中,則可不用轉(zhuǎn)義

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容