Linux 做業和進程

1、處理信號

Linux利用信號與運行在系統中的進程進行通訊,進程的信號就是預約義好的一個消息,進程能識別它並決定是忽略仍是作出反應。進程如何處理信號是由開發人員經過編程來決定的,大多數編寫完善的程序都能接收和處理標準Unix進程信號。Linux進程信號以下:shell

信號 名稱 描述
1 SIGHUP 掛起進程
2 SIGINT 終止進程
3 SIGQUIT 中止進程
9 SIGKILL 無條件終止進程
15 SIGTERM 儘量終止進程
17 SIGSTOP 無條件中止進程,但不是終止進程
18 SIGTSTP 中止或暫停進程,但不終止進程
19 SIGCONT 繼續運行中止的進程

~
進程和做業的區別:編程

  • 區別:進程是一個程序在一個數據集上的一次執行,而做業是用戶提交給系統的一個任務。
  • 關係:一個做業一般包括幾個進程,幾個進程共同完成一個任務,即做業。
  • 用戶提交做業之後,看成業被調度,系統會爲做業建立進程,一個進程沒法完成時,系統會爲這個進程建立子進程。

1. 生成信號

bash shell容許用鍵盤上的組合鍵生成兩種基本的Linux信號,在須要中止或暫停失控程序時很是方便。
1. 中斷進程
CTRL+C組合鍵會生成SIGINT信號,並將其發送給當前shell中運行的全部進程。ubuntu

SIGINT

如圖,執行sleep過程當中,使用CTRL+C能夠中斷此sleep命令。c#

2. 暫停進程
你能夠在程序運行期間暫停進程,而無需終止它。CTRL+Z會生成一個SIGTSTP信號,中止shell中運行的任何進程。中止和終止進程不一樣:中止進程會讓程序繼續保留在內存中,並能從上次暫停的位置繼續運行。bash

sintstp

同理,咱們使用CTRL+Z時,能夠發現此進程是暫停了,使用kill命令發送SIGKILL信號能夠將其終止。服務器

2、後臺模式運行腳本

之後臺模式運行腳本或命令很是簡單,只須要在命令後加一個&符號就能夠了。以下示例:編輯器

shell bg

加上了&符號的sleep命令後,顯示的第一行爲做業號和PID,Linux系統中每一個進程都有惟一的PID。此時用jobs命令查看,會發現它正在running狀態。當其運行完之後運行jobs能夠發現:ide

root@ubuntu:~# jobs
[1]-  Done                    sleep 100
[2]+  Done                    sleep 200
  • 1
  • 2
  • 3

若是想在終端退出後做業仍之後臺模式運行到結束,即便退出了終端會話,這能夠用nohup命令來實現。nohup命令會將全部消息重定向到名爲nohup.oout文件中,而不是顯示在終端中。函數

jobs命令輸出中的+和-
上面咱們運行了兩個job,經過jobs命令輸出是能夠看到後面有加號和減號,這是什麼意思呢?帶加號的做業會被當作默認做業,當咱們不指定做業號時,該做業被當作做業命令的操做對象。而帶減號的是下一個默認做業。以下圖示例,使用bg將命令切換到後臺。咱們也可使用bg 做業號來指定做業號將其放入後臺,使用fg 做業號將其放入前臺模式運行。ui

bg

當命令處於stopped狀態時能夠經過bg或fg使其運行起來。

3、定時運行做業

Linux中提供了at命令和cron表來設置在某個預設的時間運行腳本。

1. 用at命令來計劃執行做業

at命令的基本格式爲:at [-f filename] time,使用-f參數來指定用於讀取命令的文件名。time指定了合適運行該做業,在指定time上面,支持的時間格式不少:
- 標準的小時和分鐘格式,如18:34
- AM/PM指示符,指定上午下午
- 標準日期格式,如MMDDYY、DD.MM.YY等
- 時間增量,如now+25min等等

例如咱們要在三分鐘後執行一個腳本,就能夠用:at -f test1.sh now +3 min 來執行。執行以後,Linux系統就會將此做業提交到做業隊列中,做業隊列會保存經過at命令提交的待處理的做業。經過atq來查看當前的做業隊列,而後能夠經過atrm job_id來刪除做業。

shell -at

然而,at命令只是執行一次的,若是想要重複按期執行,就須要使用crontab了。

2. 用crontab按期執行做業

Linux程序使用cron程序來安排要按期執行的做業,cron程序會在後臺運行並檢查crontab(即cron時間表),來獲知安排執行的做業。
crontab的格式以下:

min hour dayofmonth month dayofweek command

min:分鐘,0~59
hour:小時,0~23
dayofmonth:幾號,1~31
month:月份,1~12
week:星期幾,0~6(週日,週一...週六)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

好比,
在每週一早上十點執行命令:00 10 * * 1 command
每月的第一天12:00執行命令:00 12 1 * * command
若是是在每月的最後一天呢?由於有多是2九、30、31,因此要用其餘的方法:如00 12 * * * if [ 'date +%d -d tomorrow' = 01 ]; then;command

1. 構造crontab
使用crontab -l來查看當前的cron時間表。
使用crontab -e來編輯crontab。輸入crontab -e以後,會跳轉到編輯器中,輸入crontab命令便可。若是咱們對腳本運行時間的精確度要求不高的話,能夠將其放在系統預置的cron腳本目錄中便可:

crontab

如圖中的cron.daily、cron.hourly、cron.monthly、cron.weekly。須要天天執行的腳本放在cron.daily中便可,其餘相似。

2. anacron程序
cron程序存在的問題是它假定Linux是7X24h運行的,若是某個做業在crontab中安排的時間到了,但這時候Linux是關機狀態的話,這個做業就不會執行。當系統開機後,cron程序不會再去運行那些錯過的做業,要解決這個問題,能夠用anacron程序。

anacron程序只會處理位於cron目錄的程序,它用時間戳來決定做業是否在正確的計劃間隔內運行了。每一個cron目錄都有個時間戳文件,該文件位於/var/spool/anacron/目錄下面:

root@ubuntu:~# cd /var/spool/anacron/
root@ubuntu:/var/spool/anacron# ls
cron.daily  cron.monthly  cron.weekly
  • 1
  • 2
  • 3
  • 4

anacron使用本身的時間表來檢查做業目錄,/etc/anacrontab以下:

root@ubuntu:/etc# ll |grep anacron
-rw-r--r--   1 root root      401 Dec 29  2014 anacrontab
root@ubuntu:/etc# cat anacrontab 
# /etc/anacrontab: configuration file for anacron

# See anacron(8) and anacrontab(5) for details.

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
HOME=/root
LOGNAME=root

# These replace cron's entries
1   5   cron.daily  run-parts --report /etc/cron.daily
7   10  cron.weekly run-parts --report /etc/cron.weekly
@monthly    15  cron.monthly    run-parts --report /etc/cron.monthly
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

anacrontab的格式爲:period delay identifier command,period定義做業多就運行一次,以天爲單位;delay以分鐘爲單位指定了系統啓動後anacron須要等待多長時間再運行錯過的做業;identifier 表示日誌消息和錯誤郵件中的做業?command條目包含了run-parts程序和一個cron腳本名,如/etc/cron.daily等。
注意:anacron程序不會處理執行時間需求小於一天的腳本。

4、查看系統資源使用狀況

也能夠叫作進程管理,而進程管理的做用主要有三個:

  1. 判斷服務器健康狀態
  2. 查看系統中全部進程
  3. 殺死進程,釋放資源

1. uptime

執行uptime以後,能夠看見以下輸出:

root@ubuntu:~# uptime
 12:07:29 up 2 min,  1 user,  load average: 0.25, 0.23, 0.09
  • 1
  • 2
  • 3

這個命令能夠快速查看機器的負載狀況,顯示的是開機時間、用戶數、負載,負載三個數字意思是1分鐘、5分鐘、15分鐘CPU的平均負載狀況。咱們應該怎麼理解CPU平均負載呢?是否是其數值越小越好?結果並不是這樣。

首先,咱們應該知道咱們的處理器有幾個處理器,每一個處理器有幾個核心,能夠經過命令cat /proc/cpuinfo |grep "cpu cores"來查看。

在多核處理中,你的系統均值不該該高於處理器核心的總數量。

好比說你的機器是雙核CPU,那麼平均負載不該該高於2;若是是2個CPU,每一個CPU是4核的,那麼平均負載不該該高於8。一般,應該關注於五分鐘或者十五分鐘的平均負載。

2. vmstat

vmstat用來得到有關進程、虛擬內存、頁面交換空間及CPU活動的信息,能夠全面反映系統的負載狀況。經常使用的方式是vmstat命令經過兩個數字參數來統計信息,第一個參數是採樣的時間間隔數,單位是秒,第二個參數是採樣的次數,如:

root@ubuntu:~# vmstat 3 3
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 0  0      0 820216  37088 507628    0    0    42     2   41   65  0  0 99  0  0
 0  0      0 820216  37088 507628    0    0     0     0  356  495  0  0 99  0  0
 1  0      0 745040  37120 507636    0    0     0   111  990 1409  3 18 79  1  0
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

上面的信息統計的是每隔3秒、統計共3次的狀態。每個欄位表明的是什麼意思呢?
proc進程:
r:等待在CPU資源的進程數。這個數據比平均負載更加可以體現CPU負載狀況,數據中不包含等待IO的進程。若是這個數值大於機器CPU核數,那麼機器的CPU資源已經飽和。
b :表示阻塞的進程

Memory內存

swpd:正在使用虛擬的內存大小,單位k
free:空閒內存大小
buff:已用的buff大小,對塊設備的讀寫進行緩衝
cache:已用的cache大小,文件系統的cache

Swap交換內存
si:每秒從交換區寫入內存的大小(單位:kb/s)
so:每秒從內存寫到交換區的大小

IO 磁盤
bi:每秒讀取的塊數(讀磁盤),這裏的塊設備是指系統上全部的磁盤和其餘塊設備,默認塊大小是1024byte
bo:每秒寫入的塊數(寫磁盤)

system
in:每秒中斷數,包括時鐘中斷
cs:每秒上下文切換數(每次調用系統函數,咱們的代碼就會進入內核空間,致使上下文切換,這個很耗資源,也要儘可能避免頻繁調用系統函數。上下文切換次數過多表示你的CPU大部分浪費在上下文切換,致使CPU幹正經事的時間少了,CPU沒有充分利用,是不可取的。)
這兩個值越大,會看到由內核消耗的cpu時間會越多。

CPU(百分比)
Us:用戶進程執行消耗cpu時間(user time)。us的值比較高時,說明用戶進程消耗的cpu時間多
Sy:系統進程消耗cpu時間(system time)。sys的值太高時,說明系統內核消耗的cpu資源多,這個不是良性的表現,咱們應該檢查緣由。
Id:空閒時間(包括IO等待時間)
Wa:等待IO時間。Wa太高時,說明io等待比較嚴重,這多是因爲磁盤大量隨機訪問形成的,也有多是磁盤的帶寬出現瓶頸。

3. free

free命令能夠查看系統內存的使用狀況。

root@ubuntu:~# free -h
              total        used        free      shared  buff/cache   available
Mem:           1.9G        650M        795M         16M        536M        1.1G
Swap:          1.0G          0B        1.0G
  • 1
  • 2
  • 3
  • 4
  • 5

-h表示以易讀的單位顯示。

4. top

top命令包含了前面好幾個命令的檢查的內容。好比系統負載狀況(uptime)、系統內存使用狀況(free)、系統CPU使用狀況 (vmstat)等。所以經過這個命令,能夠相對全面的查看系統負載的來源。同時,top命令支持排序,能夠按照不一樣的列排序,方便查找出諸如內存佔用最 多的進程、CPU佔用率最高的進程等。選項的使用及輸出的信息也和前面相似。

#經常使用操做
top   //默認,每隔5秒顯式全部進程的資源佔用狀況
top -d n  //delay每隔n秒顯式全部進程的資源佔用狀況
top -p 1234 -p 6789//每隔5秒顯示pid是1234和pid是6789的兩個進程的資源佔用狀況
top -d 2 -p 123 //每隔2秒顯示pid是123的進程的資源使用狀況
  • 1
  • 2
  • 3
  • 4
  • 5

下面簡單的介紹一下top命令的輸出,便於去查看資源的使用狀況。

#top命令的輸出

#第一行爲開機時間,用戶數,負載。和uptime輸出相似
top - 13:54:48 up  1:49,  1 user,  load average: 0.00, 0.00, 0.00
#第二行爲總進程數,正在運行的、睡眠的、中止的、殭屍進程。
Tasks: 251 total,   1 running, 246 sleeping,   4 stopped,   0 zombie
#第三行爲CPU的使用狀況,和vmstat中輸出的相似
%Cpu(s):  0.3 us,  1.3 sy,  0.0 ni, 98.4 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
#第四行爲內存的使用
KiB Mem :  2030472 total,   671712 free,   714120 used,   644640 buff/cache
#第五行爲交換內存的狀況
KiB Swap:  1046524 total,  1046524 free,        0 used.  1100272 avail Mem 

#主要的幾個值爲: NI 「nice值,負值表示高優先級,正值表示低優先級」、 VIRT 「進程使用的虛擬內存總量」、RES 「進程使用的、未被換出的物理內存大小」、 SHR 「共享內存大小」、S 「進程狀態」、TIME+ 「進程使用CPU總時間」
   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
相關文章
相關標籤/搜索