1. 程式人生 > >Linux 作業和程序

Linux 作業和程序

一、處理訊號

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

訊號 名稱 描述
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中執行的所有程序。

SIGINT

如圖,執行sleep過程中,使用CTRL+C可以中斷此sleep命令。

2. 暫停程序
你可以在程式執行期間暫停程序,而無需終止它。CTRL+Z會生成一個SIGTSTP訊號,停止shell中執行的任何程序。停止和終止程序不同:停止程序會讓程式繼續保留在記憶體中,並能從上次暫停的位置繼續執行。

sintstp

同理,我們使用CTRL+Z時,可以發現此程序是暫停了,使用kill命令傳送SIGKILL訊號可以將其終止。

二、後臺模式執行指令碼

以後臺模式執行指令碼或命令非常簡單,只需要在命令後加一個&符號就可以了。如下示例:

shell bg

加上了&符號的sleep命令後,顯示的第一行為作業號和PID,Linux系統中每個程序都有唯一的PID。此時用jobs命令檢視,會發現它正在running狀態。當其執行完以後執行jobs可以發現:

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

如果想在終端退出後作業仍以後臺模式執行到結束,即使退出了終端會話,這可以用nohup命令來實現。nohup命令會將所有訊息重定向到名為nohup.oout檔案中,而不是顯示在終端中。

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

bg

當命令處於stopped狀態時可以通過bg或fg使其執行起來。

三、定時執行作業

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(週日,週一...週六)

比如,
在每週一早上十點執行命令:00 10 * * 1 command
每個月的第一天12:00執行命令:00 12 1 * * command
如果是在每個月的最後一天呢?因為有可能是29、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

anacron使用自己的時間表來檢查作業目錄,/etc/anacrontab如下:

[email protected]:/etc# ll |grep anacron
-rw-r--r--   1 root root      401 Dec 29  2014 anacrontab
[email protected]:/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程式不會處理執行時間需求小於一天的指令碼。

四、檢視系統資源使用情況

也可以叫做程序管理,而程序管理的作用主要有三個:

  1. 判斷伺服器健康狀態
  2. 檢視系統中所有程序
  3. 殺死程序,釋放資源

1. uptime

執行uptime之後,可以看見如下輸出:

[email protected]:~# 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。通常,應該關注於五分鐘或者十五分鐘的平均負載。

2. vmstat

vmstat用來獲得有關程序、虛擬記憶體、頁面交換空間及CPU活動的資訊,可以全面反映系統的負載情況。常用的方式是vmstat命令通過兩個數字引數來統計資訊,第一個引數是取樣的時間間隔數,單位是秒,第二個引數是取樣的次數,如:

[email protected]:~# 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等待比較嚴重,這可能是由於磁碟大量隨機訪問造成的,也有可能是磁碟的頻寬出現瓶頸。

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

-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的程序的資源使用情況

下面簡單的介紹一下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