Linux利用信號與運行在系統中的進程進行通訊,進程的信號就是預約義好的一個消息,進程能識別它並決定是忽略仍是作出反應。進程如何處理信號是由開發人員經過編程來決定的,大多數編寫完善的程序都能接收和處理標準Unix進程信號。Linux進程信號以下:shell
信號 | 名稱 | 描述 |
---|---|---|
1 | SIGHUP | 掛起進程 |
2 | SIGINT | 終止進程 |
3 | SIGQUIT | 中止進程 |
9 | SIGKILL | 無條件終止進程 |
15 | SIGTERM | 儘量終止進程 |
17 | SIGSTOP | 無條件中止進程,但不是終止進程 |
18 | SIGTSTP | 中止或暫停進程,但不終止進程 |
19 | SIGCONT | 繼續運行中止的進程 |
~
進程和做業的區別:編程
bash shell容許用鍵盤上的組合鍵生成兩種基本的Linux信號,在須要中止或暫停失控程序時很是方便。
1. 中斷進程
CTRL+C組合鍵會生成SIGINT信號,並將其發送給當前shell中運行的全部進程。ubuntu
如圖,執行sleep過程當中,使用CTRL+C能夠中斷此sleep命令。c#
2. 暫停進程
你能夠在程序運行期間暫停進程,而無需終止它。CTRL+Z會生成一個SIGTSTP信號,中止shell中運行的任何進程。中止和終止進程不一樣:中止進程會讓程序繼續保留在內存中,並能從上次暫停的位置繼續運行。bash
同理,咱們使用CTRL+Z時,能夠發現此進程是暫停了,使用kill命令發送SIGKILL信號能夠將其終止。服務器
之後臺模式運行腳本或命令很是簡單,只須要在命令後加一個&符號就能夠了。以下示例:編輯器
加上了&符號的sleep命令後,顯示的第一行爲做業號和PID,Linux系統中每一個進程都有惟一的PID。此時用jobs命令查看,會發現它正在running狀態。當其運行完之後運行jobs能夠發現:ide
root@ubuntu:~# jobs [1]- Done sleep 100 [2]+ Done sleep 200
若是想在終端退出後做業仍之後臺模式運行到結束,即便退出了終端會話,這能夠用nohup命令來實現。nohup命令會將全部消息重定向到名爲nohup.oout文件中,而不是顯示在終端中。函數
jobs命令輸出中的+和-
上面咱們運行了兩個job,經過jobs命令輸出是能夠看到後面有加號和減號,這是什麼意思呢?帶加號的做業會被當作默認做業,當咱們不指定做業號時,該做業被當作做業命令的操做對象。而帶減號的是下一個默認做業。以下圖示例,使用bg將命令切換到後臺。咱們也可使用bg 做業號
來指定做業號將其放入後臺,使用fg 做業號
將其放入前臺模式運行。ui
當命令處於stopped狀態時能夠經過bg或fg使其運行起來。
Linux中提供了at命令和cron表來設置在某個預設的時間運行腳本。
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
來刪除做業。
然而,at命令只是執行一次的,若是想要重複按期執行,就須要使用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(週日,週一...週六)
好比,
在每週一早上十點執行命令: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腳本目錄中便可:
如圖中的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
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
anacrontab的格式爲:period delay identifier command
,period定義做業多就運行一次,以天爲單位;delay以分鐘爲單位指定了系統啓動後anacron須要等待多長時間再運行錯過的做業;identifier 表示日誌消息和錯誤郵件中的做業?command條目包含了run-parts程序和一個cron腳本名,如/etc/cron.daily等。
注意:anacron程序不會處理執行時間需求小於一天的腳本。
也能夠叫作進程管理,而進程管理的做用主要有三個:
執行uptime以後,能夠看見以下輸出:
root@ubuntu:~# uptime 12:07:29 up 2 min, 1 user, load average: 0.25, 0.23, 0.09
這個命令能夠快速查看機器的負載狀況,顯示的是開機時間、用戶數、負載,負載三個數字意思是1分鐘、5分鐘、15分鐘CPU的平均負載狀況。咱們應該怎麼理解CPU平均負載呢?是否是其數值越小越好?結果並不是這樣。
首先,咱們應該知道咱們的處理器有幾個處理器,每一個處理器有幾個核心,能夠經過命令cat /proc/cpuinfo |grep "cpu cores"
來查看。
在多核處理中,你的系統均值不該該高於處理器核心的總數量。
好比說你的機器是雙核CPU,那麼平均負載不該該高於2;若是是2個CPU,每一個CPU是4核的,那麼平均負載不該該高於8。一般,應該關注於五分鐘或者十五分鐘的平均負載。
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
上面的信息統計的是每隔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等待比較嚴重,這多是因爲磁盤大量隨機訪問形成的,也有多是磁盤的帶寬出現瓶頸。
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
-h表示以易讀的單位顯示。
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的進程的資源使用狀況
下面簡單的介紹一下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