Linux進程管理和計劃任務

進程管理篇

進程概念

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

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

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

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

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

    存在生命周期

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

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

進程創建:

    init:第一個進程

        父子關系

    進程:都由其父進程創建,CoW

        fork(), clone()

進程優先級

    系統優先級:數字越小,優先級越高

        0-139(CentOS4,5)

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

        0-98,99(CentOS6)

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

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

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

    睡眠態:

        可中斷:interrup table

        不可中斷: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

    -p 顯示進程編號

示例:

以樹狀可以很清晰看見進程跟進程之間的關系

wKiom1fdMUTjCyaYAABeqQp2ReQ600.png

連進程編號一起顯示

wKioL1fdMUTi3zijAAA7OZdG7GA798.png

ps命令: process state 顯示進程狀態

    ps-report a snapshot of the current processes

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

列舉進程ps

適用ps來查看進程信息

    ps [OPTION]…

支持三種選項:

    UNIX選項如-A -e

    BSD選項如a

    GUN選項如–help

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

    a 選項包括所有終端中的進程

    x 選項包括不鏈接終端的進程

    u 選項顯示進程所有者的信息

    f 選項顯示進程的父進程

    o 屬性… 選項顯示定制的信息:

       pid、comm、%cpu、%mem、state、tty、euser(EffectiveUser)、ruser(RealUser)

示例1:ps的常用選項使用

VSZ:許諾使用內存

RSS:實際使用內存

wKiom1fdMYrDE6GPAABVtszCQv8068.png

示例2:指定查看相關的進程信息

假設wan用戶在修改密碼,此時passwd會用到SUID的權限

wKiom1fdMYzg5sMoAAARjv3BGhU289.png

此時用root賬號查看賬號可以看見,此處可以看euser是root,ruser是wan,此處體現了SUID的作用了

wKioL1fdMY2gC5u9AAASqHAkiA4935.png

假如只通過ps直接查看該進程的時候,只會顯示euser的用戶,但是該進去實際用戶是wan

wKiom1fdMY6RVKuKAAAarT6oxOc038.png

進程管理工具

VSZ: Virtual memory SiZe,虛擬內存集,線性內存,許諾使用內存,

RSS: ReSidentSize, 常駐內存集,實際使用內存

STAT:進程狀態

    R:running 正在運行

    S: interrup table sleeping

    D: uninterrup table 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: 實時優先級

wKioL1fdMeTx71WwAABfWXwdR4w209.png

CentOS 6優先級關系對應表,越左邊的優先級越高,越右邊的優先級越低

wKiom1fdMfbSxmyRAAqnXRcLyq0808.png

CentOS 4和5優先級關系對應表,越左邊的優先級越高,越右邊的優先級越低

wKiom1fdMgHzdEu4AAbPvnsXJQ0275.png


搜索進程

最靈活:ps 選項 |  其它命令

按預定義的模式:pgrep

    pgrep [options] pattern

        -u uid: effective user,生效者

        -U uid: real user,真正發起運行命令者

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

        -l: 顯示進程名

        -a: 顯示完整格式的進程名

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

示例:搜索指定進程

wKioL1fdMjHTEM6rAAApyjS8SvM082.png

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

    pidof bash

示例:搜索指定進程的pid

wKiom1fdMjKRAhWrAAAKj-v8UlA032.png

uptime命令

顯示當前時間,系統已啟動的時間、當前上線人數,系統平均負載

系統平均負載:(1、5、10分鐘的平均負載,一般不會超過1)

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

如果每個CPU內核的當前活動進程數不大于3的話,那么系統的性能良好。如果每個CPU內核的任務數大于5,那么這臺機器的性能有嚴重問題。

如果linux主機是1個雙核CPU的話,當Load Average 為6的時候說明機器已經被充分使用了。

Linux進程管理和計劃任務

top命令

選項:

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

    -b: 以批次方式

    -n #: 顯示多少批次

有許多內置命令:

排序:

    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):任務所有者ID

USER (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時間,精確到秒

wKioL1fdMmfDjO0jAAC2J4isZBs894.png


htop命令:需從Fedora-EPEL源安裝

選項:

    -d #: 指定延遲時間;

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

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

子命令:

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

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

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

    t: 顯示進程樹

wKioL1fdMpHQiwLXAADjBk3GydY926.png

F1-F10選項

F3直接搜索進程

wKiom1fdMpOg8QlqAADWIyxnxgU173.png

F9發送kill命令,默認級別是15

wKioL1fdMpXiXx-hAAEDLzSN7ME166.png


vmstat命令:查看虛擬內存信息

    vmstat [options] [delay [count]]

        -s 內存信息匯總

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: Time spent 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.

示例1:vmstat 2 5 兩秒一次,顯示5次

wKiom1fdMuiDqqasAABG4qGx-Eg459.png

示例2:查看內存匯總信息

wKiom1fdMuvDN_oGAABl-9Fy3jg941.png

示例3:dd if=/dev/sda of=/dev/null 測試硬盤讀數據,并且監控

wKioL1fdMuzAGmqCAAAaoFRhWc0966.png

可以看見io bi暴增,假如系統的io值過高,這個時候就需要查看是系統哪個進程占用大量的io了

wKiom1fdMu7CHSsuAACqvGi2XWk442.png

示例4:dd if=/dev/zero of=f1       測試硬盤寫數據,并且監控

wKioL1fdMu6hYovdAAAaVjKhpjk783.png

可以看見io bo暴增,假如系統的io值過高,這個時候就需要查看是系統哪個進程占用大量的io了

wKiom1fdMvDBofVcAACgZnPGONE989.png

注意:示例3和示例4都是測試磁盤吞吐量

如果io比較大,可以看看是哪個程序產生那么大的io,磁盤io太大的話會帶來系統的負載偏大

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

pmap [options]  pid […]

    -x: 顯示詳細格式的信息;

示例:pmap 1

wKioL1fdMzqim4DNAADGJsmHMjw720.png

另外一種實現:

cat /proc/PID/maps

wKiom1fdMz3QQFalAAE_WDdlvrc482.png

glances命令:glances – A cross-platform curses-based monitoring tool (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的相關數據單獨顯示

內建命令:

    a Sort processes automatically

    l Show/hide logs

    c Sort processes by CPU%

    b Bytes or bits for network I/O

    m Sort processes by MEM%

    w Delete warning logs

    p Sort processes by name

    x Delete warning and critical logs

    i Sort processes by I/O rate

    1 Global CPU or per-CPU stats

    d Show/hide disk I/O stats

    h Show/hide this help screen

    f Show/hide file system stats

    t View network I/O as combination

    n Show/hide network stats

    u View cumulative network I/O

    s Show/hide sensors stats

    q Quit (Esc and Ctrl-C also work)

    y Show/hide hddtempstats

C/S模式下運行glances命令

服務模式:

    glances -s -B IPADDR

    IPADDR: 指明監聽的本機哪個地址

客戶端模式:

    glances -c IPADDR

    IPADDR:要連入的服務器端地址

示例1:通過glances觀察網絡流量

wKioL1fdM4yiA235AAE0P7txEUc019.png

此刻向10.1.156.68的主機發送大量的ping包

wKiom1fdM43i8QnUAAAVv0AamDs952.png

可以看見eth0的接口的流量飆升

wKiom1fdM4-yFeoiAAE4CHh11eg932.png


示例2:通過c/s模式監控網絡流量

首先服務端開啟glances服務

wKioL1fdM5Dj2glIAAAQuiyWNVM510.png

從客服端開啟監控服務

wKiom1fdM5DDrWdvAAALejgqh0E669.png

已經鏈接上了

wKioL1fdM5PywZ6vAAFMwMSMWB0686.png

這個時候從一個端口向服務端發送大流量包,然后再觀察流量,可以看見網絡流量有明顯的變化

wKioL1fdM5WwBWgLAAFbt6f8EPk240.png


dstat命令:系統資源統計

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: 顯示延遲最大的進程

示例:用dstat監控網絡流量

當網絡端口接收到流量的時候,net的監控端的流量會發生明顯的變化

wKiom1fdM9eS9Ol2AACHx-JKYfo564.png

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: 顯示父進程為此處指定的進程的進程列表

示例1:正常關閉掉進程

kill命令指定進程號殺掉進程,默認的級別是15

wKioL1fdNCDyuhVlAABJhB8HsiU667.png

此時此進程已經被殺掉

wKiom1fdNCLiSbiQAAASJKEhBXI861.png

示例2:強制殺掉某進程(進程可以使用pkill -9 -t pts/1 等直接殺掉哦)

現在要殺掉此進程

wKioL1fdNCOS1fYLAAANYFrRj3I991.png

查看此進程的pid號碼

wKiom1fdNCSSWvt_AAAjHXyfMvM313.png

正常的15信號會發現是殺不死此進程

wKioL1fdNCXjnFjfAABuWD2ez9M770.png

發送強制信號9殺死進程,發現此進程已經被殺死

wKiom1fdNCaxbKzMAAAgIXEe8G0074.png

示例3:殺死所有的指定進程

wKiom1fdNCeS_n8xAABAb7XfEr0213.png

示例4:殺死指定匹配的進程

wKioL1fdNCjTnZ-xAABH2ePM0MA391.png


Linux作業管理篇

Linux的作業控制

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

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

如何讓作業運行于后臺?

    (1) 運行中的作業:Ctrl+z

    (2) 尚未啟動的作業:COMMAND &

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

    nohup COMMAND & screen;COMMAND (此處可以查看Linux入門幫助篇screen的用法)

查看所有作業:

    jobs

作業控制:

    fg[[%]JOB_NUM]:把指定的后臺作業調回前臺;

    bg[[%]JOB_NUM]:讓送往后臺的作業在后臺繼續運行;

    kill [%JOB_NUM]:終止指定的作業;

前臺運行、后臺運行、后臺休眠關系圖

wKiom1fc_c_CLq9uAAAZ6ha8T0g747.png

示例1:把前臺進程轉到后臺運行,并且把它關閉

在命令后面加上&符號,把進程轉到后臺運行,下圖可以看見,開始會提示[1] 3193表示他的pid號和jobs的編號,

然后在中間輸入了ctrl+c的信號,但是程序并沒有停止下來

如果上面的jobs號被刷掉的話,此時可以快速輸入jobs命令,會顯示jobs 1正在運行,然后再執行fg加指定jobs編號把命令調回來前臺執行,然后按ctrl+c終止掉命令

wKioL1fdANigFXLAAACy7N78yYk428.png

示例2:把程序調到后臺休眠狀態,然后再把程序調回去后臺運行

wKioL1fdApaCjBRqAABQLkpuFxY231.png

如果向程序繼續在調后臺執行,則輸入bg加jobs num

wKioL1fdAv7DwSrTAACgVWpVD1A153.png

示例3:通過kill命令對后臺命令進程操作

kill第18級命令,喚醒后臺的休眠的做工,讓其繼續在后臺運行

wKiom1fdBwSSFZmfAACQ1BUTk1M976.png

kill第19號命令,讓程序進入后臺休眠狀態

wKioL1fdBwXR5ajvAACN-_MZkwU257.png

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

正常來說,同時執行幾個命令,他們應該是按照順序執行,一個完成后再執行另外以一個

同時運行多個程序的方法:

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

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

    

示例:同時運行多個程序

wKioL1fdBjuDGTYfAAAq2Rl3Ksc717.png

wKiom1fdBjuTJW0tAAAuViH9EjI990.png

進程優先級調整:

    靜態優先級:100-139

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

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

    普通用戶能把自己運行的程序的優先級調低,但是不能調高

nice命令:只能夠指定未開始執行的程序

    nice [OPTION] [COMMAND [ARG]…]

renice命令:對已經正在進行的程序重新分配其優先級

    renice [-n] priority pid…

查看:

ps axo pid,comm,ni

示例1:調高某程序的優先級

ping程序的默認ni優先級只有0

wKioL1fdCzaA_M7rAAANCf95X40219.png

nice -10 指定該命令優先級為10

wKiom1fdCziS_SsVAABJjmt4KDk657.png

ps axo指定查看其優先級,可以看見優先級已經改變

wKioL1fdCzmzytGpAAANiuG5XWg509.png

如果需要改其優先級為負數的話,則輸入–

wKioL1fdCzqRErH3AAA7zwJtBpQ195.png

可以看見此時已經是負數的優先級

wKiom1fdCzrSJNQ9AAAM9HbO81I535.png

示例2:重新修改某程序優先級

wKiom1fdDCyzqPDRAABfEKCedoA142.png

任務計劃

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

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

    at

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

周期性運行某任務:

    cron

at任務

包:at

at命令:at [option] TIME

常用選項:

    -V 顯示版本信息:

    -l: 列出指定隊列中等待運行的作業;相當于atq

    -d: 刪除指定的作業;相當于atrm

    -c: 查看具體作業任務

    -f /path/from/somefile:從指定的文件中讀取任務

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

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

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

     [YYYY-mm-dd]

    noon, midnight, teatime(4pm)

    tomorrow

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

示例:

HH:MM 02:00

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

HH:MM YYYY-MM-DD 04: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 minutes

04pm + 3 days

at任務執行方式:

  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 命令

示例1:新建一個計劃任務

在17:52分,執行命令echo hello world,但是我們并沒有看見有任務,原來是因為echo hello world是標準輸出,有標準輸出的計劃任務,都會以發郵件顯示,所以這一點需要注意。

wKioL1fdEpXCyivvAACb2bFWshM655.png

示例2:添加白名單控制,指定某用戶才能執行at任務

可以看見,在白名單里面添加了wan的用戶,此用戶可以執行at計劃任務,但是wan2用戶不在白名單里面,所以執行at命令的時候就會提示權限不夠。

wKiom1fdFDPjOIFbAABZFuoxBlk404.png

示例3:重定向腳本到at任務里面

wKiom1fdFiLCyRCFAAA26UJcJm4462.png

周期性任務計劃cron

相關的程序包:

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

cronie-anacron:cronie的補充程序;用于監控cronie任務執行狀況;如cronie中的任務在過去該運行的時間點未能正常運行,則anacron會隨后啟動一次此任務

crontabs:包含CentOS提供系統維護任務

計劃任務

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

    CentOS 7:

        systemctl status crond

    CentOS 6:

        service crond     status

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

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

        /etc/crontab

    用戶cron任務:

        crontab命令

日志:/var/log/cron

系統cron任務的/etc/crontab文件格式

wKioL1fdF7yhSs4EAACQaf5eRTQ883.png

系統cron任務:/etc/crontab

注釋行以# 開頭

詳情參見man 5 crontab

# Example of job definition:

# .—————-minute (0 -59)

# | .————-hour (0 -23)

# | | .———-day of month (1 -31)

# | | | .——-month (1 -12) OR jan,feb,mar,apr…

# | | | | .—-day of week (0 -6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat

# | | | | |

# * * * * * user-name command to be executed

例如:晚上9點10分以centos身份運行echo命令;

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

時間表示法:

(1) 特定值;

    給定時間點有效取值范圍內的值

(2) *

    給定時間點上有效取值范圍內的所有值

    表示“每…”

(3) 離散取值:

    #,#,#

(4) 連續取值:-

    #-#

(5) 在指定時間范圍上,定義步長:

    /# : #即為步長

    例如:每3小時echo命令;

    0 */3 * * * centos /bin/echo "howdy!"

一些特殊的時間表示格式

@reboot 表示每次重啟以后執行    Run once after reboot.

@yearly 表示每年1月1日執行   0 0 1 1 *

@annually 同上   0 0 1 1 *

@monthly 每個月1號執行   0 0 1 * *

@weekly 每周日執行   0 0 * * 0

@daily 每天執行   0 0 * * *

@hourly 每小時執行   0 * * * *

示例1:新增系統計劃任務

wKiom1fdHuWDPowdAACK8hnydhE529.png


示例2:讓系統計劃任務執行指定腳本

執行腳本的時候,如果是非root用戶,需要注意用戶執行腳本的權限

新增一個任務:工作日時間,每10分鐘執行一次磁盤空間檢查,一旦發現任何分區利用率高于80%,就執行wall警報

wKiom1fdMJKgqj26AABaLj10vn4285.png

wKioL1fdMCPhNNohAAAg-iDmnBA362.png

anacron系統

運行計算機關機時cron不運行的任務,CentOS6以后版本取消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/中文件的時間戳

系統的計劃任務:

/etc/crontab

/etc/cron.d/   配置文件

定義一些系統的配置文件,例如0hourly,表示每小時執行run-parts對/etc/cron.hourly里面的任務

wKiom1fdGZ3Rsj7iAABzzx8hfNU417.png

/etc/cron.hourly/   每小時執行的腳本

wKioL1fdGm6TgUr7AABbldOr8OA445.png

/etc/cron.daily/   腳本

系統為什么剛安裝完以后,一部分命令的幫助手冊沒有的原因。然后過一段時間會自動生成幫助手冊,原因就在這里了,因為系統每天定義會自動執行mandb的命令(centos7)

wKioL1fdGrjCQdBrAACH2ztIRdE198.png

/etc/cron.weekly/   每周腳本,默認為空

wKiom1fdGybywGN2AAAVN24XJws134.png

/etc/cron.monthly/   每月腳本,默認為空

wKioL1fdGybTOj1UAAAUDlouRKU610.png

管理臨時文件

CentOS6使用/etc/cron.daily/tmpwatch定時清除臨時文件

CentOS7使用systemd-tmpfiles-setup服務實現

配置文件:

    /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

命令:

    systemd-tmpfiles –clean|remove|create configfile

示例:系統自定義的定義清理臨時文件的腳本,每10天清理/tmp目錄,沒30天清理/var/tmp目錄

wKioL1fdIJnDxnr_AABTS4E-Gs0810.png

用戶計劃任務cron:

crontab命令定義,每個用戶都有專用的cron任務文件:/var/spool/cron/USERNAME

crontab命令:

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

    -l: 列出所有任務;

    -e: 編輯任務;

    -r: 移除所有任務;

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

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

控制用戶執行計劃任務:(此處用法原理跟at的allow和deny是一樣的)

   /etc/cron.{allow,deny}

示例1:創建wan用戶的任務

創建任務1:每周2, 4, 7備份/var/log/messages文件至/logs目錄中,文件名形如“messages-yyyymmdd”

創建任務2:每兩小時取出當前系統/proc/meminfo文件中以S或M開頭的信息追加至/tmp/meminfo.txt文件中

wKioL1fdJ5ySDfRjAABcvg8QunM411.png

示例2:添加計劃任務的權限

當白名單存在的時候,僅允許白名單的用戶執行計劃任務,其他用戶不予執行。

假如白名單不存在的時候,僅有黑名單文件,那么,僅黑名單的用戶不能執行計劃任務,其他用戶都可以執行計劃任務。

wKiom1fdKQ2RjNjsAABcvg8QunM188.png

示例3:刪除計劃任務

wKiom1fdKYPiM5XTAAA-EGrnAME363.png

示例4:編輯指定用戶的計劃任務

wKioL1fdKmXB7DX8AABP__CaFDg358.png

at任務和crontab任務的區別

一次性作業使用at

重復性作業使用crontab

Create創建任務     at time     crontab -e

List列表任務      at -l      crontab -l

Details查看細節     at -c jobnum   N/A

Remove刪除任務     at -d jobnum   crontab -r

Edit          N/A       crontab -e

沒有被重定向的輸出會被郵寄給用戶

根用戶能夠修改其它用戶的作業

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

    (1) COMMAND > /dev/null

    (2) COMMAND &> /dev/null

對于cron任務來講,%有特殊用途;如果在命令中要使用%,則需要轉義;不過,如果把%放置于單引號中,也可以不用轉義

思考:參考sleep命令~

(1) 如何在秒級別運行任務?

* * * * * for min in 0 1 2; do echo "hi"; sleep 20; done

(2) 如何實現每7分鐘運行一次任務?

sleep命令:

    sleep NUMBER[SUFFIX]…

        SUFFIX:

        s: 秒, 默認

        m: 分

        h: 小時

        d: 天

原創文章,作者:~微風~,如若轉載,請注明出處:http://www.www58058.com/47225

(0)
~微風~~微風~
上一篇 2016-09-17 20:41
下一篇 2016-09-17 21:45

相關推薦

  • chmod命令詳細用法

    指令名稱 : chmod 使用權限 : 所有使用者 使用方式 : chmod [-cfvR] [–help] [–version] mode file… 說明 : …

    Linux干貨 2016-10-17
  • 磁盤管理

    一、知識整理 1、每個扇區:512字節;每個柱面:256個磁頭*63個扇區*512字節,大概為8M。centos6中分區使用起始結束柱面;centos7中分區使用起始結束扇區。EBR:擴展分區的第一個扇區。 2、MBR:master root record,1982年,使用32位表示扇區數,分區不超過2T。其中,一共512bytes字節,446bytes為b…

    Linux干貨 2016-08-29
  • N25-第14周博客作業

    系統的INPUT和OUTPUT默認策略為DROP; iptables -P INPUT DROP iptables -P OUTPUT DROP [root@localhost ~]# iptables -L -n  Chain INPUT…

    Linux干貨 2017-05-21
  • 馬哥教育網絡班21期第9周課程練習

    1、寫一個腳本,判斷當前系統上所有用戶的shell是否為可登錄shell(即用戶的shell不是/sbin/nologin);分別這兩類用戶的個數;通過字符串比較來實現; #!/bin/bash # declare -i nologin_user;other_user all_users=`awk -F':'…

    Linux干貨 2016-09-19
  • Linux之bash shell腳本編程入門篇(三)之循環以及函數function的使用

    bash shell腳本編程入門篇(三)之循環 什么是循環執行?     將某代碼段重復運行多次     重復運行多少次:         循環次數事先已知    &nb…

    Linux干貨 2016-08-22
  • 馬哥教育網絡班22期第二周課程練習1-未聞花名

    1、Linux管理文件和目錄的命令 命令 功能 命令 功能 pwd 顯示當前目錄 ls 查看目錄下的內容 cd 改變所在目錄 cat 顯示文件的內容 grep 在文件中查找某字符 cp 復制文件 touch 創建文件 mv 移動文件 rm 刪除文件 rmdir 刪除目錄 1.1 pwd命令 該命令的英文解釋為print working directory(打…

    Linux干貨 2016-08-29
欧美性久久久久