Linux進程與計劃任務

Linux進程與計劃任務

linux進程及作業管理

進程

內核的功用:進程管理、文件系統、網絡功能、內存管理、驅動程序、安全功能等特權操作
模式切換(理想狀態):70%CPU時間用戶模式+30%CPU時間內核模式
進程(Process):是計算機中的程序關於某數據集合上的一次運行活動,是系統進行資源分配和調度的存在生命週期的基本單位,是操作系統結構的基礎。在早期面向進程設計的計算機結構中,進程是程序的基本執行實體;在當代面向線程設計的計算機結構中,進程是線程的容器。程序是指令、數據及其組織形式的描述,進程是程序的實體,運行中的程序的一個副本;被載入到內存的一個指令集合
進程ID:PID號碼被用來標記各個進程
UID、GID、和SELinux語境決定對文件系統的存取和訪問權限,通常從執行進程的用戶來繼承
Linux內核存儲進程信息的固定數據結構格式:task struct
多個任務的task struck組件的鏈表:task list

進程創建:

1.引起創建進程的事件
在多道程序環境中,只有(作爲)進程(時)才能在系統中運行。因此,爲使程序能運行,就必須爲它創建進程。導致一個進程去創建另一個進程的典型事件,可以有以下四類:
1) 用戶登錄
在分時系統中,用戶在終端鍵入登錄命令後,如果是合法用戶,系統將爲該終端建立一個進程,並把它插入到就緒隊列中。
2)作業調度
在批處理系統中,當作業調度程序按照一定的算法調度到某作業時,便將該作業裝入到內存,爲它分配必要的資源,並立即爲它創建進程,再插入到就緒隊列中。
3) 提供服務
當運行中的用戶程序提出某種請求後,系統將專門創建一個進程來提供用戶所需要的服務,例如,用戶程序要求進行文件打印,操作系統將爲它創建一個打印進程,這樣,不僅可以使打印進程與該用戶進程併發執行,而且還便於計算出爲完成打印任務所花費的時間。
4) 應用請求
在上述三種情況中,都是由系統內核爲它創建一個新進程,而這一類事件則是基於應用進程的需求,由它創建一個新的進程,以便使新進程以併發的運行方式完成特定任務。
2.進程的創建過程
一旦操作系統發現了要求創建新進程的事件後,便調用進程創建原語create()按下述步驟創建一個新進程。
1) 申請空白PCB。爲新進程申請獲得唯一的數字標識符,並從PCB集合中索取一個空白PCB。
2) 爲新進程分配資源。爲新進程的程序和數據以及用戶棧分配必要的內存空間。顯然,此時操作系統必須知道新進程所需要的內存大小。
3) 初始化進程控制塊。PCB的初始化包括:
①初始化標識信息,將系統分配的標識符和父進程標識符,填入新的PCB中。
②初始化處理機狀態信息,使程序計數器指向程序的入口地址,使棧指針指向棧頂。
③初始化處理機控制信息,將進程的狀態設置爲就緒狀態或靜止就緒狀態,對於優先級,通常是將它設置爲最低優先級,除非用戶以顯式的方式提出高優先級要求。
4) 將新進程插入就緒隊列,如果進程就緒隊列能夠接納新進程,便將新進程插入到就緒隊列中。
進程終止
1.引起進程終止的事件
1)正常結束
在任何計算機系統中,都應該有一個表示進程已經運行完成的指示。例如,在批處理系統中,通常在程序的最後安排一條Hold指令或終止的系統調用。當程序運行到Hold指令時,將產生一箇中斷,去通知OS本進程已經完成。
2)異常結束
在進程運行期間,由於出現某些錯誤和故障而迫使進程終止。這類異常事件很多,常見的有:越界錯誤,保護錯,非法指令,特權指令錯,運行超時,等待超時,算術運算錯,I/O故障。
3)外界干預
外界干預並非指在本進程運行中出現了異常事件,而是指進程應外界的請求而終止運行。這些干預有:操作員或操作系統干預,父進程請求,父進程終止。

init:系統的第一個進程
進程:進程之間爲父子關係都有其父進程創建(CoW寫時複製)
1、系統父進程以fork()方式產生一個一模一樣的子進程,這個進程與父進程唯一的差別就是PID不同,但是這個進程還會多一個PPID的參數,PPID就是父進程的程序識別碼PID
2、然後複製clone()出來的子進程再來運行實際要執行的程序

進程優先級:

系統優先級: 數字越小,優先級越高
0-139( CentOS4,5)
各有140個運行隊列和過期隊列
0-98, 99( CentOS6)
實時優先級: 99-0:值最大優先級最高
靜態優先級:100-139
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內核:搶佔式多任務工作模式
進程類型:
1)守護進程(服務): daemon,由內核在系統引導過程中啓動的進程, 和終端無關進程
2)前臺進程:跟終端相關,通過終端啓動的進程(用戶進程)
注意:兩者可相互轉化
進程狀態:
運行態: running
就緒態: ready(可以運行但是沒運行)
睡眠態:
1)可中斷: interruptable
2)不可中斷: uninterruptable
數據從磁盤——>內核內存——>進程內存——>進程處理數據
第一階段爲數據裝入
第二階段爲數據I/O
停止態: stopped,暫停於內存中,但不會被調度,除非手動啓動
僵死態: zombie,結束進程,父進程結束前,子進程不關閉

系統管理工具
根據進程佔用資源的多少可以講進程分爲(進程的分類):
CPU-Bound: CPU密集型(對CPU密集型是對cpu佔用率高的進程),非交互
IO-Bound: IO密集型(等待I/O時間長的進程),交互

推薦書籍:《Linux內核設計於實現》、《深入理解Linux內核》

Linux系統狀態的查看及管理工具: pstree, ps, pidof,pgrep, top, htop, glance, pmap, vmstat, dstat, kill,pkill, job, bg, fg, nohup

init分類
CentOS5:SysV init
CentOS6:upstart
CentOS7:Systemd

/sbin/init

進程信息獲取工具

pstree命令

pstree指令用ASCII字符顯示樹狀結構,清楚地表達程序間的相互關係。如果不指定程序識別碼或用戶名稱,則會把系統啓動時的第一個程序視爲基層,並顯示之後的所有程序。若指定用戶名稱,便會以隸屬該用戶的第一個程序當作基層,然後顯示該用戶的所有程序。
使用ps命令得到的數據精確,但數據龐大,這一點對掌握系統整體概況來說是不容易的。pstree命令正好可以彌補這個缺憾。它能將當前的執行程序以樹狀結構顯示。pstree命令支持指定特定程序(PID)或使用者(USER)作爲顯示的起始。
使用格式:
pstree [-a, --arguments] [-c, --compact] [-h, --highlight-all, -Hpid, --highlight-pid pid] [-g] --show-pgids] [-l, --long] [-n, --numeric-sort] [-N, --ns-sortns [-p, --show-pids] [-s, --show-parents] [-S, --ns-changes] [-u, --uid-changes] [-Z, --security-context] [-A, --ascii, -G, --vt100, -U, --unicode] [pid, user]
選項:
-a  顯示每個程序的完整指令,包含路徑,參數或是常駐服務的標示。
-c  不使用精簡標示法。
-G  使用VT100終端機的列繪圖字符。
-h  列出樹狀圖時,特別標明執行的程序。
-H<程序識別碼>  此參數的效果和指定"-h"參數類似,但特別標明指定的程序。
-l  採用長列格式顯示樹狀圖。
-n  用程序識別碼排序。預設是以程序名稱來排序。
-p  顯示程序識別碼。
-u  顯示用戶名稱。
-U  使用UTF-8列繪圖字符。
-V  顯示版本信息。

[root@localhost ~]# pstree
systemd─┬─ModemManager───2*[{ModemManager}]
├─abrt-dbus───{abrt-dbus}
├─2*[abrt-watch-log]
├─abrtd
├─accounts-daemon───2*[{accounts-daemon}]
├─alsactl
├─anacron
├─at-spi-bus-laun─┬─dbus-daemon───{dbus-daemon}
│ └─3*[{at-spi-bus-laun}]
├─at-spi2-registr───{at-spi2-registr}
├─atd
├─auditd─┬─audispd─┬─sedispatch
││ └─{audispd}
│└─{auditd}
├─avahi-daemon───avahi-daemon
├─bluetoothd
├─caribou───2*[{caribou}]
├─chronyd
├─colord───2*[{colord}]
├─crond
├─cupsd
├─2*[dbus-daemon───{dbus-daemon}]
├─dbus-launch
├─dconf-service───2*[{dconf-service}]
├─2*[dhclient]
├─dnsmasq───dnsmasq
├─evolution-calen───5*[{evolution-calen}]
├─evolution-sourc───2*[{evolution-sourc}]
├─gconfd-2
├─gdm─┬─Xorg
│ ├─gdm-session-wor─┬─gnome-session─┬─abrt-applet───{abrt-applet}
│ │ │   ├─gnome-settings-───4*[{gnome-settings-}]
│ │ │   ├─gnome-shell─┬─ibus-daemon─┬─ibus-dconf───3*[{ibus-dconf}]
│ │ │   │ │ ├─ibus-engine-sim───2*[{ibus-engine-sim}]
│ │ │   │ │ └─2*[{ibus-daemon}]
│ │ │   │ └─6*[{gnome-shell}]
│ │ │   ├─gnome-software───3*[{gnome-software}]
│ │ │   ├─nautilus───3*[{nautilus}]
│ │ │   ├─seapplet
│ │ │   ├─ssh-agent
│ │ │   ├─tracker-extract───13*[{tracker-extract}]
│ │ │   ├─tracker-miner-a───2*[{tracker-miner-a}]
│ │ │   ├─tracker-miner-f───3*[{tracker-miner-f}]
│ │ │   ├─tracker-miner-u───2*[{tracker-miner-u}]
│ │ │   └─3*[{gnome-session}]
│ │ └─2*[{gdm-session-wor}]
│ └─3*[{gdm}]
├─gnome-keyring-d───4*[{gnome-keyring-d}]
├─gnome-shell-cal───4*[{gnome-shell-cal}]
├─gnome-terminal-─┬─bash
│ ├─gnome-pty-helpe
│ └─3*[{gnome-terminal-}]
├─goa-daemon───3*[{goa-daemon}]
├─goa-identity-se───2*[{goa-identity-se}]
├─gsd-printer───{gsd-printer}
├─gssproxy───5*[{gssproxy}]
├─gvfs-afc-volume───2*[{gvfs-afc-volume}]
├─gvfs-goa-volume───{gvfs-goa-volume}
├─gvfs-gphoto2-vo───{gvfs-gphoto2-vo}
├─gvfs-mtp-volume───{gvfs-mtp-volume}
├─gvfs-udisks2-vo───2*[{gvfs-udisks2-vo}]
├─gvfsd───{gvfsd}
├─gvfsd-fuse───4*[{gvfsd-fuse}]
├─gvfsd-metadata───{gvfsd-metadata}
├─gvfsd-trash───2*[{gvfsd-trash}]
├─ibus-x11───2*[{ibus-x11}]
├─ksmtuned───sleep
├─libvirtd───15*[{libvirtd}]
├─lsmd
├─lvmetad
├─master─┬─pickup
│└─qmgr
├─mission-control───2*[{mission-control}]
├─packagekitd───2*[{packagekitd}]
├─polkitd───5*[{polkitd}]
├─pulseaudio───2*[{pulseaudio}]
├─rsyslogd───2*[{rsyslogd}]
├─rtkit-daemon───2*[{rtkit-daemon}]
├─smartd
├─sshd───sshd─┬─bash
│ └─bash───pstree
├─systemd-journal
├─systemd-logind
├─systemd-udevd
├─tracker-store───7*[{tracker-store}]
├─tuned───4*[{tuned}]
├─udisksd───4*[{udisksd}]
├─upowerd───2*[{upowerd}]
├─vmtoolsd───{vmtoolsd}
├─vmtoolsd
└─wpa_supplicant

ps命令

ps命令用於報告當前系統的進程狀態。可以搭配kill指令隨時中斷、刪除不必要的程序。ps命令是最基本同時也是非常強大的進程查看命令,使用該命令可以確定有哪些進程正在運行和運行的狀態、進程是否結束、進程有沒有僵死、哪些進程佔用了過多的資源等等,總之大部分信息都是可以通過執行該命令得到的。
注意:
內核中的狀態信息
內核參數可設置其值從而調整內核運行特性的參數;多數存儲在/proc/sys/
狀態變量:其用於輸出內核中統計信息或狀態信息,僅用於查看;
參數:模擬成文件系統類型;
Linux系統各進程的相關信息均保存在/proc/PID目錄下的各文件中

ps
選項風格:
1 UNIX選項,這可能是分組之前,必須用一個破折號(-)。
2 BSD選項,這可能是分組,不得使用破折號。
3 GNU長選項,之前兩個破折號(--)。
示例:

[root@localhost ~]# ps a
   PID TTY  STAT   TIME COMMAND
  1480 tty1 Ss+0:02 /usr/bin/Xorg :0 -background none -noreset -audit 4 -verbose -auth /run/gdm/auth-for-gd
  4313 pts/0Ss+0:00 /bin/bash
  4367 pts/1Ss 0:00 -bash
  4456 pts/2Ss 0:00 -bash
  4774 pts/2S+ 0:00 man ps
  4785 pts/2S+ 0:00 less -s
  4820 pts/1R+ 0:00 ps a
[root@localhost ~]# ps -a
   PID TTY  TIME CMD
  4774 pts/200:00:00 man
  4785 pts/200:00:00 less
  4821 pts/100:00:00 ps

啓動進程的方式:
系統啓動過程中自動啓動:與終端無關的進程;
用戶通過終端啓動:與終端相關的進程;

參數說明:
-a 顯示所有終端機下執行的進程,除了階段作業領導者之外。
a 顯示現行終端機下的所有進程,包括其他用戶的進程。
-A 顯示所有進程。
-c 顯示CLS和PRI欄位。
c 列出進程時,顯示每個進程真正的指令名稱,而不包含路徑,參數或常駐服務的標示。
-C<指令名稱>  指定執行指令的名稱,並列出該指令的進程的狀況。
-d  顯示所有進程,但不包括階段作業領導者的進程。
-e  此參數的效果和指定"A"參數相同。
e  列出進程時,顯示每個進程所使用的環境變量。
-f  顯示UID,PPIP,C與STIME欄位。
f  用ASCII字符顯示樹狀結構,表達進程間的相互關係。
o field1,field2... 自定義要顯示的字段列表,以逗號分隔
-g<羣組名稱>  此參數的效果和指定"-G"參數相同,當亦能使用階段作業領導者的名稱來指定。
g  顯示現行終端機下的所有進程,包括羣組領導者的進程。
-G<羣組識別碼>  列出屬於該羣組的進程的狀況,也可使用羣組名稱來指定。
h  不顯示標題列。
-H  顯示樹狀結構,表示進程間的相互關係。
-j或j  採用工作控制的格式顯示進程狀況。
-l或l  採用詳細的格式來顯示進程狀況。
L  列出欄位的相關信息。
-m或m  顯示所有的執行緒。
n  以數字來表示USER和WCHAN欄位。
-N  顯示所有的進程,除了執行ps指令終端機下的進程之外。
-p<進程識別碼>  指定進程識別碼,並列出該進程的狀況。
p<進程識別碼>  此參數的效果和指定"-p"參數相同,只在列表格式方面稍有差異。
r  只列出現行終端機正在執行中的進程。
-s<階段作業>  指定階段作業的進程識別碼,並列出隸屬該階段作業的進程的狀況。
s  採用進程信號的格式顯示進程狀況。
S  列出進程時,包括已中斷的子進程資料。
-t<終端機編號>  指定終端機編號,並列出屬於該終端機的進程的狀況。
t<終端機編號>  此參數的效果和指定"-t"參數相同,只在列表格式方面稍有差異。
-T  顯示現行終端機下的所有進程。
-u<用戶識別碼>  此參數的效果和指定"-U"參數相同。
u  以用戶爲主的格式來顯示進程狀況。
-U<用戶識別碼>  列出屬於該用戶的進程的狀況,也可使用用戶名稱來指定。
U<用戶名稱>  列出屬於該用戶的進程的狀況。
v  採用虛擬內存的格式顯示進程狀況。
-V或V  顯示版本信息。
-w或w  採用寬闊的格式來顯示進程狀況。 
x  顯示所有進程,不以終端機來區分。
X  採用舊式的Linux i386登陸格式顯示進程狀況。
-y 配合參數"-l"使用時,不顯示F(flag)欄位,並以RSS欄位取代ADDR欄位
-<進程識別碼>  此參數的效果和指定"p"參數相同。
--cols<每列字符數>  設置每列的最大字符數。
--columns<每列字符數>  此參數的效果和指定"--cols"參數相同。
--cumulative  此參數的效果和指定"S"參數相同。
--deselect  此參數的效果和指定"-N"參數相同。
--forest  此參數的效果和指定"f"參數相同。
--headers  重複顯示標題列。
--help  在線幫助。
--info  顯示排錯信息。
--lines<顯示列數> 設置顯示畫面的列數。
--no-headers 此參數的效果和指定"h"參數相同,只在列表格式方面稍有差異。
--group<羣組名稱>  此參數的效果和指定"-G"參數相同。
--Group<羣組識別碼>  此參數的效果和指定"-G"參數相同。
--pid<進程識別碼>  此參數的效果和指定"-p"參數相同。
--rows<顯示列數>  此參數的效果和指定"--lines"參數相同。
--sid<階段作業>  此參數的效果和指定"-s"參數相同。
--tty<終端機編號>  此參數的效果和指定"-t"參數相同。
--user<用戶名稱>  此參數的效果和指定"-U"參數相同。
--User<用戶識別碼>  此參數的效果和指定"-U"參數相同。
--version  此參數的效果和指定"-V"參數相同。
--widty<每列字符數>  此參數的效果和指定"-cols"參數相同。

ps命令能夠看到進程的線程
例如帶有[]的即爲內核的線程

常用命令組合之一
#ps axu

[root@localhost ~]# ps axu
USERPID %CPU %MEMVSZ   RSS TTY  STAT START   TIME COMMAND
root  1  0.0  0.3 125948  6720 ?Ss   13:10   0:03 /usr/lib/systemd/systemd --switched-root --system --deserialize 21
root  2  0.0  0.0  0 0 ?S13:10   0:00 [kthreadd]
...

USER:發起進程用戶
PID:進程編號
%CPU:使用CPU積累時間
%MEM:內存空間佔用比率
VSZ(Virtual memory SiZe):虛擬內存集(即真正佔用內存;線性內存)(佔用虛擬內存大小)注意:不是swap!
RSS(ReSident Size):常駐內存集(不可以存放在交換內存中的)
TTY:終端
STAT:狀態

  • R: running(運行態)

  • S: interruptable sleeping(可中斷睡眠態)

  • D: uninterruptable sleeping(不可中斷睡眠態)

  • T: stopped(停止態)

  • Z: zombie(僵死態)

  • +: 前臺進程

  • l: 多線程進程

  • N:低優先級進程

  • <: 高優先級進程

  • s: session leader,會話(子進程)發起者

常用組合之二
#ps -ef

[root@localhost ~]# ps -ef
UID PID   PPID  C STIME TTY  TIME CMD
root  1  0  0 13:10 ?00:00:03 /usr/lib/systemd/systemd --switched-root --system --deserialize 2
root  2  0  0 13:10 ?00:00:00 [kthreadd]
...

UID:進程發起用戶
PID:進程號
PPID:父進程的進程號
注意:進程號存在0號,init的父進程,過渡進程,系統啓動完終止
C:cpu佔用百分比
STIME:啓動時間
TTY:與何終端相關
TIME:累計運行時間
CMD:啓動進程命令

常用組合之三
#ps -eFH

[root@localhost ~]# ps -eFH
UID PID   PPID  CSZ   RSS PSR STIME TTY  TIME CMD
root  2  0  0 0 0   0 13:10 ?00:00:00 [kthreadd]
root  3  2  0 0 0   0 13:10 ?00:00:00   [ksoftirqd/0]
root  6  2  0 0 0   0 13:10 ?00:00:00   [kworker/u256:0]

CMD列:縮進級別相同的,同一個級別

PSR:運行在那顆cpu上

常用組合之四
#ps -eo
#ps axo
常用field:pid,ni(nice值),prl(prlority優先級),psr(運行在那顆cpu上),pcpu(cpu利用率),stat(狀態),comm(進程發起命令),tty(與何終端相關),ppid(父進程號)

示例:
# ps axo pid,comm,pcpu //查看進程的PID、名稱以及CPU 佔用率
# ps axo pid,comm,pcpu --sort=pcpu // sort 參數以pcpu 爲對象對

[root@localhost ~]# ps axo pid,command
   PID COMMAND
 1 /usr/lib/systemd/systemd --switched-root --system --deserialize 21
 2 [kthreadd]
 3 [ksoftirqd/0]
 6 [kworker/u256:0]
 7 [migration/0]
 ...

[root@localhost ~]# ps -eo pid,command
   PID COMMAND
 1 /usr/lib/systemd/systemd --switched-root --system --deserialize 21
 2 [kthreadd]

進程搜索工具

pgrep與pkill命令

pgrep命令以名稱爲依據從運行進程隊列中查找進程,並顯示查找到的進程id。即通過程序的名字來查詢進程的工具,一般是用來判斷程序是否正在運行。每一個進程ID以一個十進制數表示,通過一個分割字符串和下一個ID分開,默認的分割字符串是一個新行。對於每個屬性選項,用戶可以在命令行上指定一個以逗號分割的可能值的集合。
使用格式:
pgrep [options] pattern
pkill [options] pattern
選項:
-u uid:顯示生效用戶的進程
-U uid:顯示用戶啓動的進程
-t TERMINAL:與指定的終端相關的進程;
-l:顯示進程名;
-a:顯示完整格式的進程名
-p pid:顯示進程對應的子進程

pidof命令

pidof命令用於查找指定名稱的進程的進程號id號。
按確切的程序名稱: /sbin/pidof
使用格式:pidof <進程名>
選項:
-s:僅返回一個進程號;
-c:僅顯示具有相同“root”目錄的進程;
-x:顯示由腳本開啓的進程;
-o:指定不顯示的進程ID。

[root@localhost ~]# pidof bash
4456 4367 4313 896

進程管理工具

top命令

top命令可以實時動態地查看系統的整體運行情況,是一個綜合了多方信息監測系統性能和運行信息的實用工具。通過top命令所提供的互動式界面,用熱鍵可以管理。
使用格式:
top -hv|-bcHiOSs -d secs -n max -u|U user -p pid -o fld -w [cols]

[root@localhost ~]# top

top - 17:27:00 up  4:16,  4 users,  load average: 0.00, 0.01, 0.05
Tasks: 422 total,   2 running, 420 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.3 us,  0.7 sy,  0.0 ni, 99.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  1868664 total,   674092 free,   544128 used,   650444 buff/cache
KiB Swap:  4194300 total,  4194300 free,0 used.  1106604 avail Mem 

   PID USER  PR  NIVIRTRESSHR S %CPU %MEM TIME+ COMMAND   
  3242 root  20   0  377552  18184  14528 S  0.7  1.0   0:19.19 vmtoolsd  
  6283 root  20   0  146404   2316   1428 R  0.7  0.1   0:02.88 top   
  3132 root  20   0 1473280 165536  47824 S  0.3  8.9   0:11.92 gnome-shell   
  3705 root  20   0   0  0  0 S  0.3  0.0   0:13.26 kworker/0:0   
 1 root  20   0  125948   6720   3920 S  0.0  0.4   0:04.13 systemd   
 2 root  20   0   0  0  0 S  0.0  0.0   0:00.04 kthreadd  
 3 root  20   0   0  0  0 S  0.0  0.0   0:00.11 ksoftirqd/0

每一行代表的含義:
第一行:

  1. 當前的系統時間;即:top - 17:27:00

  2. 系統啓動到現在所經過的時間;即:up 4:16

  3. 當前已經登錄系統的用戶數;即4 users

  4. 系統在1,5,15分鐘的平均負載,值越小表示系統越空閒,如果高於cpu數量,就需要注意當前系統負載過高;即:load average: 0.00, 0.01, 0.05

此行顯示的信息等同於uptime命令顯示信息
uptime命令:顯示系統時間、運行時長、當前上線人數及平均負載
過去1分鐘、5分鐘和15分鐘的各自平均負載,一般不會超過1
平均負載:指在特定時間間隔內運行隊列中的平均進程數。即等待運行的進程隊列的長度;
如果每個CPU內核的當前活動進程數不大於3的話,那麼系統的性能良好。 如果每個CPU內核的任務數大於5,那麼這臺機器的性能有嚴重問題。
如果linux主機是1個雙核CPU的話,當Load Average 爲6的時候說明機器已經被充分使用了。

[root@localhost ~]# uptime
 18:29:46 up  5:19,  4 users,  load average: 0.00, 0.01, 0.05

第二行
顯示的是目前進程的總量與個別程序在什麼狀態(running、sleeping、stopped、zombie)
注意:最後的zombie數值不爲0,需要具體查看那個進程處於僵死狀態
例如:
Tasks: 422 total(進程總量),
2 running(運行態進程量),
420 sleeping(睡眠態進程量),
0 stopped(停止態進程量),
0 zombie(僵死態進程量)

第三行
顯示的是CPU的整體負載,如果是多核心的cpu,可以按下數字鍵1來切換成不同的CPU的負載均衡;

us:用戶空間(用戶進程佔據的cpu百分比)
sy:內核空間(用於運行內核佔據的cpu百分比)
ni:調整nice時間用戶進程空間所改變過優先級的進程佔用CPU的百分比
id:空閒cpu的百分比
wa:等待IO花費時間
hi:硬件中斷佔用cpu的百分比
si:軟件中斷(模式切換)佔用cpu的百分比
st:虛擬機偷走的時間百分比
cs:處理上下文(進程)切換佔用的cpu的百分比

第四行
表示物理內存的使用情況
第五行
表示交換分區的使用情況

Mem: 4147888k total[物理內存總量]
2493092k used[使用的物理內存總量]
1654796k free[空閒內存總量]
158188k buffers[用作內核緩存的內存量]
Swap: 5144568k total[交換區總量]
56k used[使用的交換區總量]
5144512k free[空閒交換區總量]
2013180k cached[緩衝的交換區總量]

第六行:這裏默認顯示空白行,當在top程序當中輸入命令時,顯示狀態的地方,這裏可以輸入的命令有:
排序:
P:以佔據的CPU百分比,%CPU
M:佔據內存百分比,%MEM
T:累積佔據CPU時長,TIME+

首部信息顯示:
uptime信息: l命令
tasks及cpu信息: t命令
cpu分別顯示: 1 (數字)
memory信息: m命令
退出命令: q
修改刷新時間間隔: s 輸入數字
終止指定進程: k
保存文件: W

第七行
PID (Process Id):任務的進程ID
USER (User Name):進程所有者名稱
PR (Priority):優先級,越小優先級越高
NI:Nice的簡寫,與Priority有關,也是越小越早被運行;
VIRT:進程需要的虛擬內存大小,而非使用的虛擬內存大小
RES:進程當前使用的內存大小,不包括swap
SHR:進程與其他進程共享的內存大小,可以通過RES-SHR來計算進程所佔用的物理內存大小
S (Process Status):進程狀態
%CPU (CPU usage):CPU使用率
%MEM (Memory usage (RES)):內存使用率
TIME+ (CPU Time, hundredths):CPU使用時間的累加,精確到秒
PPID (Parent Process Pid):父任務的進程ID
RUSER (Real User Name):任務的所有者真實名稱
UID (User Id):任務所有者ID
GROUP (Group Name):任務所有者羣組名
TTY (Controlling Tty):終端

選項:
-d #: 指定刷新時間間隔,默認爲3秒
-b: batch,以批次(屏幕)方式顯示
-n #: 顯示多少批次

htop命令

htop是一款運行於Linux系統監控與進程管理軟件,用於取代Unix下傳統的top。與top只提供最消耗資源的進程列表不同,htop提供所有進程的列表,並且使用彩色標識出處理器、swap和內存狀態。
用戶一般可以在top無法提供詳盡系統信息的情況下選擇安裝並使用htop。比如,在查找應用程序的內存泄漏問題時。與top相比,htop提供更方便、光標控制的界面來殺死進程。
htop命令與top使用上沒區別

需從Fedora-EPEL源安裝
命令行選項:
-d #--delay=DELAY     設置延遲更新時間,單位秒
-u --user=USERNAME   只顯示一個給定的用戶的進程
-s --sort-key COLUME: 以指定字段進行排序;
-C --no-color        使用一個單色的配色方案
-p --pid=PID,PID…    只顯示給定的PIDs

下面是 F1~F10 的功能和對應的字母快捷鍵。

htop界面子命令:
交互式命令(INTERACTIVE COMMANDS)

上下鍵或PgUP, PgDn 選定想要的進程,左右鍵或Home, End 移動字段,當然也可以直接用鼠標選定進程;
Space 標記/取消標記一個進程。命令可以作用於多個進程,例如 "kill",將應用於所有已標記的進程
U 取消標記所有進程
s 選擇某一進程,按s:用strace追蹤進程的系統調用
l 顯示進程打開的文件: 如果安裝了lsof,按此鍵可以顯示進程所打開的文件
I 倒轉排序順序,如果排序是正序的,則反轉成倒序的,反之亦然
a (在有多處理器的機器上)設置 CPU affinity: 標記一個進程允許使用哪些CPU
u 顯示特定用戶進程
M 按Memory 使用排序
P 按CPU 使用排序
T 按Time+ 使用排序
F 跟蹤進程: 如果排序順序引起選定的進程在列表上到處移動,讓選定條跟隨該進程。這對監視一個進程非常有用:通過這種方式,你可以讓一個進程在屏幕上一直可見。使用方向鍵會停止該功能。
K 顯示/隱藏內核線程
H 顯示/隱藏用戶線程
Ctrl-L 刷新
Numbers PID 查找: 輸入PID,光標將移動到相應的進程上

內存工具

vmstat命令

vmstat命令的含義爲顯示虛擬內存狀態(“Viryual Memor Statics”),但是它可以報告關於進程、內存、I/O等系統整體運行狀態。
vmstat [options] [delay [count]]
選項:
-a:顯示活動內頁;
-f:顯示啓動後創建的進程總數;
-m:顯示slab信息;
-n:頭信息僅顯示一次;
-s:以表格方式顯示事件計數器和內存狀態; 
-d:報告磁盤狀態;
-p:顯示指定的硬盤分區狀態;
-S:輸出信息的單位。
參數
delay(事件間隔):狀態信息刷新的時間間隔;
count(次數):顯示報告的次數。
vmstat 2 5

字段說明:
Procs(進程)
r: 等待運行的進程的個數,和核心數有關,CPU上等待運行的任務的隊列長度;這個值也可以判斷是否需要增加CPU。(長期大於1)
b: 處於不可中斷睡眠態的進程個數(被阻塞的隊列的長度)(等待IO的進程數量)。

Memory(內存)
swpd: 使用虛擬內存總量,如果swpd的值不爲0,但是SI,SO的值長期爲0,這種情況不會影響系統性能。
free: 空閒物理內存總量。
buff: 用作緩衝的內存總量。
cache: 用作緩存的內存總量,如果cache的值大的時候,說明cache處的文件數多,如果頻繁訪問到的文件都能被cache處,那麼磁盤的讀IO bi會非常小。

Swap
si: 每秒從交換區寫到內存的大小,由磁盤調入內存。數據速率(kb/s)
so: 每秒寫入交換區的內存大小,由內存調入磁盤。數據速率(kb/s)
注意:內存夠用的時候,這2個值都是0,如果這2個值長期大於0時,系統性能會受到影響,磁盤IO和CPU資源都會被消耗。有些朋友看到空閒內存(free)很少的或接近於0時,就認爲內存不夠用了,不能光看這一點,還要結合si和so,如果free很少,但是si和so也很少(大多時候是0),那麼不用擔心,系統性能這時不會受到影響的。

IO(現在的Linux版本塊的大小爲1kb)
bi: 從塊設備讀入數據到系統的速率(kb/s),每秒讀取的塊數
bo: 保存數據至塊設備的速率,每秒寫入的塊數 (kb/s)
注意:隨機磁盤讀寫的時候,這2個值越大(如超出1024k),能看到CPU在IO等待的值也會越大。

system(系統)
in: interrupts, 中斷速率,每秒中斷數,包括時鐘中斷。
cs: context switch, 進程切換速率,每秒上下文切換數。
注意:上面2個值越大,會看到由內核消耗的CPU時間會越大。
注意:系統調用是基於軟中斷,與硬件相關則是硬中斷。

CPU(以百分比表示)
us: 用戶進程執行時間百分比(user time) us的值比較高時,說明用戶進程消耗的CPU時間多,但是如果長期超50%的使用,那麼我們就該考慮優化程序算法或者進行加速。
sy: 內核系統進程執行時間百分比(system time) sy的值高時,說明系統內核消耗的CPU資源多,這並不是良性表現,我們應該檢查原因。
wa: IO等待時間百分比 wa的值高時,說明IO等待比較嚴重,這可能由於磁盤大量作隨機訪問造成,也有可能磁盤出現瓶頸(塊操作)。
id: 空閒時間百分比
st(stolen):被虛擬機偷走的時間

pmap命令

pmap命令用於報告進程的內存映射關係
pmap [options] pid [...]
-x: 顯示詳細格式的信息;
-d:顯示設備格式;
-q:不顯示頭尾行;

pid:進程號:指定需要顯示內存映射關係的進程號,可以是多個進程號。
示例:

另外一種實現:
cat /proc/PID/maps

系統監控工具

glances命令

一個跨平臺curses-based監控工具
需要依賴EPEL源安裝
glances [-bdehmnrsvyz1] [-B bind] [-c server] [-C conffile] [-p port] [-P password] [--password] [-t refresh] [-f file] [-o output]
內建命令:
a 自動排序
c 根據CPU使用率排序
m 根據內存佔用比排序
p 根據進程名字排序
i 顯示進程通過I/O比率
d 顯示/隱藏硬盤I/O狀態
f 顯示/隱藏文件系統狀態
n 顯示/隱藏network狀態
s 顯示/隱藏sensors狀態
y 顯示/隱藏hddtemp狀態
l 顯示/隱藏日誌
b 網絡I/O的字節或位
w 刪除警告日誌
x 刪除警告和嚴重級別的日
1 全局CPU或者每個CPU的狀態
h 顯示/隱藏幫助會話
t 組合網絡I/O視圖
u 累計網絡I/O視圖
z 顯示/隱藏進程列表
q 退出(Esc和ctrl - c也可以)

常用選項:
-b: 以Byte爲單位顯示網卡數據速率
-d: 關閉磁盤I/O模塊
-f /path/to/somedir: 設定輸入文件位置
-o {HTML|CSV}:輸出格式
-m: 禁用mount模塊
-n: 禁用網絡模塊
-t #: 延遲時間間隔
-1:每個CPU的相關數據單獨顯示

C/S模式下運行glances命令
服務模式:
glances -s -B IPADDR
IPADDR: 指明監聽的本機某地址
客戶端模式:
glances -c IPADDR
IPADDR:要連入的服務器端地址

示例
#glances -f /dir -o HTML
可以將glances導出的信息已HTML形式保存,並且用瀏覽器查看,只要不刪除,刷新即可查看最新信息

dstat命令

dstat命令是一個用來替換vmstat、iostat、netstat、nfsstat和ifstat這些命令的工具,是一個全能系統信息統計工具。與sysstat相比,dstat擁有一個彩色的界面,在手動觀察性能狀況時,數據比較顯眼容易觀察;而且dstat支持即時刷新,譬如輸入dstat 3即每三秒收集一次,但最新的數據都會每秒刷新顯示。和sysstat相同的是,dstat也可以收集指定的性能資源,譬如dstat -c即顯示CPU的使用情況。
標準使用格式:
dstat [-afv] [options..] [delay [count]]

直接使用dstat,默認使用的是-cdngy參數,分別顯示cpu、disk、net、page、system信息,默認是1s顯示一條信息。可以在最後指定顯示一條信息的時間間隔,如dstat 5是沒5s顯示一條,dstat 5 10表示沒5s顯示一條,一共顯示10條。
選項:
-c:顯示CPU系統佔用,用戶佔用,空閒,等待,中斷,軟件中斷等信息。
-C 0,3,total:當有多個CPU時候,此參數可按需分別顯示cpu狀態,例:-C 0,1 是顯示cpu0和cpu1的信息。
-d,--disk:顯示磁盤讀寫數據大小。
-D total,hda:統計指定磁盤或彙總信息
-g:顯示頁面使用情況。
-i, --int 顯示中斷統計
-I 5,10 統計系統負載情況,包括1分鐘、5分鐘、15分鐘平均值
-l, --load 顯示系統負載情況。
-m --mem:顯示內存使用情況。
-n --net:顯示網絡狀態。
-N eth1,total:有多塊網卡時,指定要顯示的網卡。
-p:顯示進程狀態。
-r:I/O請求情況。
-s:顯示交換分區使用情況。
-S:類似D/N。
-t, --time:顯示統計時時間,對分析歷史數據非常有用
-T,--epoch:啓用時間計時器(秒)
-y, --sys:統計系統信息,包括中斷、上下文切換
--tcp:統計tcp信息
--udp:統計udp信息
--unix:統計unix信息
--raw:統計raw信息
--socket:用來顯示tcp udp端口狀態。
--ipc:報告IPC消息隊列和信號量的使用情況
--top-cpu:顯示最佔用CPU的進程
--top-io: 顯示最佔用io的進程
--top-mem: 顯示最佔用內存的進程
--top-latency: 顯示延遲最大的進程

通過dstat --list可以查看dstat能使用的所有參數,其中上面internal是dstat本身自帶的一些監控參數,下面/usr/share/dstat中是dstat的插件,這些插件可以擴展dstat的功能,如可以監控電源(battery)、mysql等。

kill命令

向進程發送控制信號,以實現對進程管理
kill 命令:發送指定的信號到相應進程。不指定信號將發送SIGTERM(15)終止指定進程。若仍無法終止該程序可用“-KILL” 參數,其發送的信號爲SIGKILL(9) ,將強制結束進程,使用ps命令或者jobs 命令可以查看進程號。root用戶將影響用戶的進程,非root用戶只能影響自己的進程
標準使用格式:

kill [-s signal|-p] [-q sigval] [-a] [--] pid...
kill -l [signal]

選項:
-a:當處理當前進程時,不限制命令名和進程號的對應關係;
-l <信息編號>:若不加<信息編號>選項,則-l參數會列出全部的信息名稱;
-p:指定kill 命令只打印相關進程的進程號,而不發送任何信號;
-s <信息名稱或編號>:指定要送出的信息;
-u:指定用戶。

顯示當前系統可用信號: 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

只有第9種信號(SIGKILL)纔可以無條件終止進程,其他信號進程都有權利忽略,下面是常用的信號:
HUP 1 終端斷線
INT 2 中斷(同 Ctrl + C)
QUIT 3 退出(同 Ctrl + \)
TERM 15 終止
KILL 9 強制終止
CONT 18 繼續(與STOP相反, fg/bg命令)
STOP 19 暫停(同 Ctrl + Z)
示例:

killall命令

killall命令使用進程的名稱來殺死進程,使用此指令可以殺死一組同名進程。我們可以使用kill命令殺死指定進程PID的進程,如果要找到我們需要殺死的進程,我們還需要在之前使用ps等命令再配合grep來查找進程,而killall把這兩個過程合二爲一,是一個很好用的命令。
killall(選項)(參數)
選項:
-e:對長名稱進行精確匹配;
-l:忽略大小寫的不同;
-p:殺死進程所屬的進程組;
-i:交互式殺死進程,殺死進程前需要進行確認;
-l:打印所有已知信號列表;
-q:如果沒有進程被殺死。則不輸出任何信息;
-r:使用正規表達式匹配要殺死的進程名稱;
-s:用指定的進程號代替默認信號“SIGTERM”;
-u:殺死指定用戶的進程。

作業管理

Linux的作業控制
前臺作業:通過終端啓動,且啓動後一直佔據終端;
後臺作業:可通過終端啓動,但啓動後即轉入後臺運行(釋放終端)
如何讓作業運行於後臺?
(1) 運行中的作業: Ctrl+z
注意:送往後臺後,作業會轉爲停止態;
(2) 尚未啓動的作業: # COMMAND &
注意:後臺作業雖然被送往後臺運行,但其依然與終端相關;退出終端,將關閉後臺作業。如果希望送往後臺後,剝離與終端的關係,可以運行以下命令
# nohup COMMAND &
#screen;COMMAND

查看所有作業:
# jobs

可實現作業控制的常用命令:
# fg [[%]JOB_NUM]:把指定的後臺作業調回前臺;
# bg [[%]JOB_NUM]:讓送往後臺的作業在後臺繼續運行;
# kill [%JOB_NUM]:終止指定的作業;

並行運行(隨機)

同時運行多個進程,提高效率
編寫腳本
例如:
vi all.sh
f1.sh&
f2.sh&
f3.sh&

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

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

進程優先級

進程優先級調整:
靜態優先級: 100-139
進程默認啓動時的nice值爲0,優先級爲120
只有根用戶才能降低nice值(提高優先性)

nice命令

nice命令以指定的優先級運行命令,這會影響相應進程的調度。
如果不指定命令,程序會顯示當前的優先級。優先級的範圍是從 -20(最大優先級) 到 19 (最小優先級)。
使用格式:
nice [OPTION] [COMMAND [ARG]...]
選項:
-n, --adjustment=N 對優先級數值加上指定整數N (默認爲10)
示例:

renice命令

renice命令可以修改正在運行的進程的調度優先級。預設是以程序識別碼指定程序調整其優先權,您亦可以指定程序羣組或用戶名稱調整優先權等級,並修改所有隸屬於該程序羣組或用戶的程序的優先權。只有系統管理者可以改變其他用戶程序的優先權,也僅有系統管理者可以設置負數等級。
renice [-n] priority [[-p] pid ...] [[-g] pgrp ...] [[-u]user ...]
參  數:
-n, --adjustment=N 對優先級數值加上指定整數N (默認爲10)
-g <程序羣組名稱>:使用程序羣組名稱,修改所有隸屬於該程序羣組的程序的優先權。
-p <程序識別碼>:改變該程序的優先權等級,此參數爲預設值。
-u <用戶名稱>:指定用戶名稱,修改所有隸屬於該用戶的程序的優先權。

查看Nice值和優先級:
#ps axo pid,comm,ni,priorlty

任務計劃

Linux任務計劃、週期性任務執行
at:未來的某時間點執行一次任務
batch:系統自行選擇空閒時間去執行此處指定的任務
cron:週期性運行某任務

at命令

at命令用於在指定時間執行命令。at允許使用一套相當複雜的指定時間的方法。它能夠接受在當天的hh:mm(小時:分鐘)式的時間指定。假如該時間已過去,那麼就放在第二天執行。當然也能夠使用midnight(深夜),noon(中午),teatime(飲茶時間,一般是下午4點)等比較模糊的 詞語來指定時間。用戶還能夠採用12小時計時制,即在時間後面加上AM(上午)或PM(下午)來說明是上午還是下午。 也能夠指定命令執行的具體日期,指定格式爲month day(月 日)或mm/dd/yy(月/日/年)或dd.mm.yy(日.月.年)。指定的日期必須跟在指定時間的後面。 上面介紹的都是絕對計時法,其實還能夠使用相對計時法,這對於安排不久就要執行的命令是很有好處的。指定格式爲:now + count time-units,now就是當前時間,time-units是時間單位,這裏能夠是minutes(分鐘)、hours(小時)、days(天)、weeks(星期)。count是時間的數量,究竟是幾天,還是幾小時,等等。 更有一種計時方法就是直接使用today(今天)、tomorrow(明天)來指定完成命令的時間。
標準使用格式:
at [-V] [-q queue] [-f file] [-mMlv] timespec...
at [-V] [-q queue] [-f file] [-mMkv] [-t time]
at -c job [job...]
atq [-V] [-q queue]
at [-rd] job [job...]
atrm [-V] job [job...]
batch
at -b
簡化格式:
at [option] TIME
常用選項:
-V:在標準錯誤上輸出版本號。
-q queue:使用指定的隊列。一個隊列用一個字母標定,有效的的隊列標定的 範圍是從a到z和從A到Z。at 的缺省隊列是 a,batch 的缺省隊列是 b。隊列的字母順序越高,則隊列運行時越謙讓(運行級別越低)。 指定的隊列 "="保留給當前運行的作業所在的隊列。 如果一個作業被提交到一個以大寫字母標定的隊列,則與提交到 batch 同樣對待。如果給 atq 指定一個隊列,則只顯示在此指定 隊列中的作業。
-m:當作業完成時即使沒有輸出也給用戶發郵件。
-f /path/from/somefile:從指定的文件中讀取任務
-l:顯示待執行任務的列表;等同於atq。
-d:刪除指定的待執行任務;等同於atrm。
-v:對於 atq, 顯示完整的在隊列中未被刪除的作業,對於其他 命令,顯示作業將要執行的時間。 顯示的時間的格式類似於"1997-02-20 14:50",但如果設置了 POSIXLY_CORRECT 環境變量之後,格式類似於"Thu Feb 20 14:50:00 1996"。
-c:查看具體作業任務

注意:作業執行命令的結果中的標準輸出和錯誤以郵件通知給相關用戶,並不會顯示輸出並且依賴於atd服務,需要啓動才能實現at任務

at時間格式
TIME:定義出什麼時候進行 at 這項任務的時間
HH:MM [YYYY-mm-dd]
MMDD[CC]YY, MM/DD/[CC]YY, DD.MM.[CC]YY or [CC]YY-MM-DD
noon(中午), midnight(深夜), teatime(4pm)
today(今天)、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
示例:
1、三天後的下午5點執行/bin/ls

[root@localhost ~]# at 5pm+3 days 
at> /bin/ls 
at> <EOT>
job 7 at 2013-01-08 17:00

2、明天17點鐘,輸出時間到指定文件內

[root@localhost ~]# at 17:20 tomorrow 
at> date >/root/2013.log 
at> <EOT>
job 8 at 2013-01-06 17:20

3、計劃任務設定後,在沒有執行之前我們可以用atq命令(等同at -l)來查看系統沒有執行的工作任務

[root@localhost ~]# atq 
8 2013-01-06 17:20 a root 
7 2013-01-08 17:00 a root

4、刪除已經設置的任務

[root@localhost ~]# atq 
8 2013-01-06 17:20 a root 
7 2013-01-08 17:00 a root 
[root@localhost ~]# atrm 7   #atrm等同於at -d     
[root@localhost ~]# atq 
8 2013-01-06 17:20 a root

5、顯示已經設置的任務內容

[root@localhost ~]# at -c 8 
#!/bin/sh 
# atrun uid=0 gid=0 
# mail root 0 
umask 22此處省略n個字符    #此處爲默認的環境變量
date >/root/2013.log

at命令執行方式
1)交互式
#at 10:45 <<EOF

echo "bash"
EOF

2)輸入重定向
#at 10:45 < /root/at.sh

3) at –f 文件
#at 10:45 -f /root/at.sh

相關目錄與文件
/var/spool/at
/etc/at.allow
/etc/at.deny
/var/spool/at/spool
/proc/loadavg
/var/run/utmp
at任務隊列存放在/var/spool/at目錄中
/etc/at.{allow,deny}控制用戶是否能執行at任務
白名單: /etc/at.allow 默認不存在,只有該文件中的用戶才能執行at命令
黑名單: /etc/at.deny 拒絕該文件中用戶執行at命令,而沒有在at.deny 文件中的使用者則可執行
如果兩個文件都不存在,只有 root 可以執行 at 命令
注意:/etc/at.{allow,deny}同時存在時白名單的優先級要高於黑名單;名單格式即爲用戶名例如:tom(注意:一行一個用戶名)

週期性任務計劃cron

相關的程序包:
cronie: 主程序包,提供crond守護進程及相關輔助工具
cronie-anacron: cronie的補充程序;用於監控cronie任務執行狀況;如cronie中的任務在過去該運行的時間點未能正常運行,則anacron會隨後啓動一次此任務
crontabs:包含CentOS提供系統維護任務
確保crond守護處於運行狀態:
CentOS 7:
systemctl status crond
CentOS 6:
service crond status
crond服務
/sbin/service crond start //啓動服務
/sbin/service crond stop //關閉服務
/sbin/service crond restart //重啓服務
/sbin/service crond reload //重新載入配置
查看crontab服務狀態:
service crond status
手動啓動crontab服務:
service crond start
查看crontab服務是否已設置爲開機啓動,執行命令:
ntsysv
加入開機自動啓動:
chkconfig –level 35 crond on

計劃週期性執行的任務提交給crond,到指定時間會自動運行系統cron任務:系統維護作業
/etc/crontab
crontab命令
日誌: /var/log/cron

計劃任務
系統cron任務:/etc/crontab
註釋行以 # 開頭
詳情參見 man 5 crontab

Linux下的任務調度分爲兩類:系統任務調度和用戶任務調度。
系統任務調度:系統週期性所要執行的工作,比如寫緩存數據到硬盤、日誌清理等。在/etc目錄下有一個crontab文件,這個就是系統任務調度的配置文件。

系統任務

/etc/crontab文件包括下面幾行:

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# For details see man 4 crontabs
# 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

前四行是用來配置crond任務運行的環境變量
第一行SHELL變量指定了系統要使用哪個shell,這裏是bash;
第二行PATH變量指定了系統執行命令的路徑;
第三行MAILTO變量指定了crond的任務執行信息將通過電子郵件發送給root用戶,如果MAILTO變量的值爲空,則表示不發送任務執行信息給用戶;
第四行的HOME變量指定了在執行命令或者腳本時使用的主目錄。

用戶任務調度:用戶定期要執行的工作,比如用戶數據備份、定時郵件提醒等。用戶可以使用 crontab 工具來定製自己的計劃任務。所有用戶定義的crontab文件都被保存在/var/spool/cron目錄中。其文件名與用戶名一致,使用者權限文件如下:
/etc/cron.deny 該文件中所列用戶不允許使用crontab命令;
/etc/cron.allow 該文件中所列用戶允許使用crontab命令;
/var/spool/cron/ 所有用戶crontab文件存放的目錄,以用戶名命名;
crontab文件的含義:用戶所建立的crontab文件中,每一行都代表一項任務,每行的每個字段代表一項設置,它的格式共分爲六個字段,前五段是時間設定段,第六段是要執行的命令段

格式內容含義:
minute: 表示分鐘,可以是從0到59之間的任何整數。
hour:表示小時,可以是從0到23之間的任何整數。
day:表示日期,可以是從1到31之間的任何整數。
month:表示月份,可以是從1到12之間的任何整數。
week:表示星期幾,可以是從0到7之間的任何整數,這裏的0或7代表星期日。
user-name:以指定的用戶身份運行任務
command:要執行的命令,可以是系統命令,也可以是自己編寫的腳本文件。
在以上各個字段中,還可以使用以下特殊字符:
(1)特定值:表示指定時間點有效取值範圍內的值
(2)星號():代表所有可能的值,例如month字段如果是星號,則表示在滿足其它字段的制約條件後每月都執行該命令操作。
(3)逗號(,):可以用逗號隔開的值指定一個列表範圍,例如,“1,2,5,7,8,9”
(4)中槓(-):可以用整數之間的中槓表示一個整數範圍,例如“2-6”表示“2,3,4,5,6”
(5)正斜線(/):可以用正斜線指定時間的間隔頻率,例如“0-23/2”表示每兩小時執行一次。同時正斜線可以和星號一起使用,例如
/10,如果用在minute字段,表示每十分鐘執行一次。

例如:
每3小時echo命令;
0 /3 centos /bin/echo "howdy!"
晚上9點10分運行echo命令;
10 21 * root /bin/echo "Howdy!"

時間格式
@reboot Run once after reboot. 重啓後執行
@yearly 0 0 1 1 * 每年
@annually 0 0 1 1 * 每年
@monthly 0 0 1 * * 每月
@weekly 0 0 * * 0 每週
@daily 0 0 * * * 每天
@hourly 0 * * * * 每小時

計劃任務
系統的計劃任務:
/etc/crontab
/etc/cron.d/ 配置文件
/etc/cron.hourly/ 腳本
/etc/cron.daily/ 腳本
/etc/cron.weekly/ 腳本
/etc/cron.monthly/腳本

crontab命令

crontab命令被用來提交和管理用戶的需要週期性執行的任務,與windows下的計劃任務類似,當安裝完成操作系統後,默認會安裝此服務工具,並且會自動啓動crond進程,crond進程每分鐘會定期檢查是否有要執行的任務,如果有要執行的任務,則自動執行該任務。每一個用戶擁有自己的crontab,配置文件存在/var下面,不能被直接編輯。
標準使用格式:
crontab [-u user] file
crontab [-u user] [-l | -r | -e] [-i] [-s]
crontab -n [ hostname ]
crontab -c
簡化格式:
crontab(選項)(參數)

選項
-e:編輯該用戶的計時器設置;
-l:列出該用戶的計時器設置;
-r:刪除該用戶的計時器設置;
-u<用戶名稱>:指定要設定計時器的用戶名稱。

參數
crontab文件:指定包含待執行任務的crontab文件。

知識擴展
Linux下的任務調度分爲兩類:系統任務調度和用戶任務調度。
系統任務調度:系統週期性所要執行的工作,比如寫緩存數據到硬盤、日誌清理等。在/etc目錄下有一個crontab文件,這個就是系統任務調度的配置文件。

anacron系統

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/中文件的時間戳

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

用戶計劃任務

用戶cron:

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

使用
crontab -e #按/etc/crontab格式手動添加計劃內容
查看計劃任務
crontab -l
並且
crontab -e 產生的文件會生成並保存在/var/spool/cron/USERNAME中
crontab -r 刪除計劃任務

注意:計劃任務的文件名必須和用戶名相同纔可以執行。

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任務來講, %有特殊用途;如果在命令中要使用%,則需要轉義;不過,如果把%放置於單引號中,也可以不用轉義

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

sleep命令

暫停指定的秒數。時間單位可以是s 表示秒(默認設置),m 表示分鐘,h 表示小時,d 表示天。 指定數字可以是一個整數,也可以是浮點數。
注意:如果參數個數超過2個,暫停的總時間爲各個參數的值的和。
sleep NUMBER[SUFFIX]...
SUFFIX:
s: 秒, 默認
m: 分
h: 小時
d: 天
sleep後面的參數可以浮點數
例如:sleep 0.5

有時在寫一些以循環方式運行的監控腳本,設置時間間隔是必不可少的,下面是一個Shell進度條的腳本演示在腳本中生成延時。

#!/bin/bash 
b='' 
for ((i=0;$i<=100;i++)) 
 do 
  printf "Progress:[%-100s]%d%%\r" $b $i 
  sleep 0.1 
  b=#$b 
 done 
echo

usleep命令是sleep命令單位爲微妙的運用
例如:usleep 1000000

練習
1、每天的2點和12點整,將/etc備份至/testdir/backup目錄中,保存的文件名稱格式爲“ etcbak-yyyy-mm-ddHH.tar.xz”
將下列代碼添加至/etc/crontab中

0 2,12 * * * root tar Jcf  /testdir/backup/etcbak-`date +\%F-\%H`.tar.xz /etc/ &> /dev/null

或者

0 4 * * * ./test/bak_etc
cat bak_etc 
#!/bin/
bash
#bakup /etc diratory
#auther chawan date:20160908
cp /etc/* /bakup/etc$(date +%F-%H)
xz /bakup/etc$(date +%F-%H)

2、每週2, 4, 7備份/var/log/messages文件至/logs目錄中,文件名形如“ messages-yyyymmdd”

將下列代碼添加至/etc/crontab中

0 0 2,4,7 root tar Jcf  /logs/messages-`date +\%Y\%m%d\`.tar.xz /var/log/messages &> /dev/null

或者

* * * * 2,4,7 ./test/logs
cat /test/logs
#!/bin/bash
#bakup /var/log/messages to /logs
cp /var/log/messages /logs/messages-`date +\%Y\%m%d\`
xz /logs/messages-`date +\%Y\%m%d\`

3、每兩小時取出當前系統/proc/meminfo文件中以S或M開頭的信息追加至/tmp/meminfo.txt文件中
將下列代碼添加至/etc/crontab中
0 /2 cat /proc/meminfo | grep "^[SM]" >> /tmp/meminfo.txt

4、工作日時間,每10分鐘執行一次磁盤空間檢查,一旦發現任何分區利用率高於80%,就執行wall警報
將下列代碼添加至/etc/crontab中
/10 1-5 . /root/bin/CiPanJinKong.sh

[root@CentOS6 ~]# cat /root/bin/CiPanJinKong.sh
#!/bin/bash
declare -A room
declare -x disk
for i in `df | egrep "^/dev/sd.*" | tr -s " " "%" | cut -d"%" -f1,5` ;do
  room["${i%%%*}"]=${i##*%}
done
for j in ${!room[*]};do
if [ ${room[$j]} -gt 5 ];then
disk="$j "$disk
fi
done
wall "$disk full"

或者

[root@CentOS6 ~]# cat /root/bin/CiPanJinKong.sh
#!/bin/bash
#
for i in `df | egrep "^/dev/sd.*" | tr -s " " "%" | cut -d"%" -f1,5` ;do
  if [ ${i##*%} -ge 5 ];then
  wall "${i%%%*} partition utilization rate is higher than 80%"
  fi
done

5、工作日時間內,對用戶docker每小執行一次“ip addr show”命令;
切換至docker用戶使用命令crontab -e進入編輯界面
加入"0 9-18 1-5 docker ip addr show"信息後保存退出

[docker@docker ~]$ crontab -l
0 9-18 * * 1-5 ip addr show

6、每4小時備份一次/etc目錄至/backup目錄中,保存的文件名稱格式爲“etc-yyyy-mm-dd-HH.tar.xz”;
在/etc/crontab文件中添加如下:

0 4 * * * ./test/bak_etc
cat bak_etc 
#!/bin/bash
#bakup /etc diratory
#auther chawan date:20160908
cp /etc/* /bakup/etc$(date +%F-%H)
xz /bakup/etc$(date +%F-%H)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章