Linux進程和計劃任務
本章內容:
進程相關概念
進程及系統相關工具
計劃任務
進程概念:
內核功能:進程管理、文件系統、網絡功能、內存管理、驅動程序、安全功能等;
process:在內存中運行的程序被稱為進程。
task struct:Linux內核存儲進程信息的數據結構格式
task list:多個任務的task list組成的鏈表
進程的創建:
centos5、6中的第一個進程為:init
進程:都有其父進程創建,COW(寫時復制)
進程優先級:
系統優先級:數字越小,優先級越高
0–139:(centos4,5)
0–99 :(centos6)
實時優先級:99–0:數值越大優先級越高
nice值:-20–19:對應的系統優先級100-139或99
進程內存:
page frame:頁框,用存儲頁面數據,存儲page 4k
LRU:近期最少使用算法,釋放內存
MMU:內存管理單元,負責轉換線性和物理地址
Linux內核:搶占式多任務
進程類型:
守護進程:daemon,在系統引導過程中啟動的進程,和終端無關的進程。
前臺進程:跟終端相關,通過終端啟動的進程。
注意:兩者可以相互轉化。
進程狀態:
運行態:running
就緒態:ready
睡眠態:
可中斷:interruptable
不可中斷: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 [options]
-p:可以列出對應進程的PID號;
-u:列出進程對應的用戶名;
-a:列出完整的命令信息;
ps命令:查看靜態的進程統計信息
ps [options]
a:顯示當前終端下的所有進程信息;
u:使用以用戶為主的格式輸出進程信息;
x:顯示當前用戶在所有終端下的進程信息;
-e:顯示系統內的所有進程信息;
-l:使用長格式顯示進程信息;
-f:使用完整的格式顯示進程信息;
執行“ps aux”命令后,將以列表的形式輸出所有進程信息,其中各字段的含義如下
USER:啟動該進程的用戶賬號的名稱。
PID:該進程在系統中的PID號,在當前系統時唯一的。
TTY:表明該進程在哪個終端上運行,“?”表示未知或不需要的終端。
STAT:顯示了進程當前的狀態,如S(休眠)、R(運行)、Z(僵死)、<(高優先級)、N(低優先級)、s(父進程)、+(前臺進程)l(多線程進程)T(停止狀態)D(不可中斷休眠)對于僵死狀態的進程應該手動終止掉。
START:啟動該進程的時間。
TIME:該進程占用CPU的時間。
COMMAND:啟動該進程的命令的名稱。
%CPU:CPU占用百分比。
%MEM:內存占用百分比。
VSZ:占用虛擬內存(swap空間)的大小。
RSS:占用常駐內存(物理內存)的大小。
搜索進程:
pgrep命令:查詢特定進程信息的專用工具。
pgrep [options] patter
-u:真正運行命令生效的用戶
-U:真正發起運行命令的用戶
-t:與指定終端相關的進程
-l:顯示進程名
-a:顯示完整格式的進程名
-p:顯示父進程為此指定的進程的進程列表
示例:
[root@centos6 proc]# pgrep -l bash
4128 bash
6761 bash
6780 bash
[root@centos6 proc]#
pidof命令:查詢指定進程的pid號。
示例:
[root@centos6 proc]# pidof bash
6780 6761 4128
[root@centos6 proc]#
uptime命令:查看系統的平均負載
顯示當前系統時間,系統已經啟動多久,當前登錄系統的人數,系統的平均負載(1、2、10分鐘的平均負載,一般不會超過1)
系統平均負載:
指在特定時間間隔內運行隊列中的平均進程數。
如果每個cpu內核的當前活動進程數不大于3的話,那么系統性能良好。如果每個CPU內核的任務大于5,那么這臺機器的性能有嚴重的問題。
如果Linux主機是1個雙內核CPU的話,當load average為6的時候說明機器已經被充分使用了。
示例:
[root@centos6 Desktop]# uptime
10:49:46 up 25 min, 2 users, load average: 0.14, 0.10, 0.18
[root@centos6 Desktop]# (平均負載)
top命令:進程管理工具,有許多內置的命令
選項:
-d#:指定刷新時間間隔,默認為3秒
-b:以批次方式顯示
-n#:顯示多少批次
排序:
P:以占據的cpu百分比,%CPU進行排序;
M:占據內存百分比,%MEM進行排序;
T:累計占據CPU的時長進行排序;
首部信息顯示:
uptime信息 :按l 鍵可以“屏蔽/顯示” uptime平均負載
tasks及CPU信息:按 t 鍵可以“屏蔽/顯示”tasks及CPU信息
CPU分別顯示:按 1(數字)可以把所有CPU單個顯示
memory信息:按 m 鍵可以“屏蔽/顯示”內存和swap的信息
退出top命令:q
修改刷新時間間隔: 按s鍵 后跟上要間隔的刷新時間(以秒為單位)
終止指定的進程:k
保存文件:W
欄位信息簡介:
us:用戶空間
sy:內核空間
ni:調整nice時間
id:空閑
wa:等待IO時間
hi:硬中斷
si:軟中斷
st:被虛擬機偷走的時間
htop命令:進程管理工具,需從Fedora-EPEL源安裝
選項:
-d#:指定延遲時間
-u:僅顯示指定用戶的進程
-s:以指定字段進行排序
vmstat命令:顯示虛擬內存信息
vmstat [options] [delay[count]]
-s:顯示內存的統計數據
示例: 每秒刷新一次,顯示5次
[root@centos6 Desktop]# vmstat 1 5
procs ———–memory———- —swap– —–io—- –system– —–cpu—–
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 0 270616 70172 278980 0 0 12 1 47 66 0 0 99 1
0 0 0 270536 70172 279012 0 0 0 0 109 131 1 0 100 0 0
0 0 0 270536 70172 279012 0 0 0 0 110 148 1 1 99 0 0
0 0 0 270536 70172 279012 0 0 0 0 93 118 1 0 100 0 0
0 0 0 270536 70172 279012 0 0 0 0 96 133 0 0 100 0
[root@centos6 Desktop]#
pmap命令:查看進程的內存映射
pmap [options] pid
-x:顯示詳細格式的信息
另一種查看方式是:
#cat /proc/PID/maps
示例:
[root@centos6 Desktop]# pgrep bash
3290
[root@centos6 Desktop]# pmap -x 3290
3290: /bin/bash
Address Kbytes RSS Dirty Mode Mapping
0000000000400000 852 536 0 r-x– bash
00000000006d4000 36 36 36 rw— bash
00000000006dd000 24 24 24 rw— [ anon ]
00000000008dc000 36 8 0 rw— bash
0000000001f5a000 264 248 248 rw— [ anon ]
0000003f24400000 128 112 0 r-x– ld-2.12.so
…………………………………………………………………………….
[root@centos6 Desktop]#
glances命令:系統監控工具 (需要從EPEL源安裝)
示例:
[root@centos6 Desktop]# glances
C/S模式下運行glances 可以實現遠程監控其他主機,適用于局域網內;
服務器端設置:
glances -s -B IPADDR
-s:指明是服務器端
-B:綁定要監控的服務器的IP地址
客戶端模式:
glances -c IPADDR
-c:指明是客戶端
IPADDR:指明要監控的服務端地址
示例:
測試環境說明:
centos 7 為服務器端,IP地址為:192.168.3.10
centos 6 為客戶機端,IP地址為:192.168.3.2
服務器模式配置:
[root@centos7 Desktop]# glances -s -B 192.168.3.10
客戶機端模式端,監控centos7
[root@centos7 Desktop]# glances -c 192.168.3.10
dstat命令:系統資源統計
dstat [-afv] [options..] [delay [count]]
-c:顯示CPU相關的信息
-d:顯示disk相關的信息
-g:顯示page相關的統計數據
-m:顯示memory相關的統計數據
-n:顯示network相關的統計信息
-p:顯示process相關的統計數據
-r:顯示IO請求相關的統計數據
-s:顯示swapped相關的統計數據
–top-cpu:顯示最占cpu的進程
–top-io:顯示最占用io的進程
–top-mem:顯示最占用內存的進程
–top-latency:顯示延遲最大的進程
示例:每隔1秒統計一次,一共統計5次
[root@centos6 Desktop]# dstat 1 5
—-total-cpu-usage—- -dsk/total- -net/total- —paging– —system–
usr sys idl wai hiq siq| read writ| recv send| in out | int csw
0 0 99 1 0 0| 25k 1837B| 0 0 | 0 0 | 93 132
0 0 100 0 0 0| 0 0 | 0 0 | 0 0 | 87 123
1 1 99 0 0 0| 0 0 | 0 0 | 0 0 | 127 143
2 1 97 0 0 0| 0 0 | 0 0 | 0 0 | 179 183
1 2 97 0 0 0| 0 0 | 0 0 | 0 0 | 149 148
1 1 98 0 0 0| 0 0 | 0 0 | 0 0 | 112 124
[root@centos6 Desktop]#
kill、killall、pkill命令:終止進程
kill命令向進程發送控制信號,以實現對進程的管理
顯示當前系統可用信號:kill -l
常用信號:
1)SIGHUP:無需關閉進程而讓其重讀配置文件;
2)SIGINT:終止正在運行的進程,相當于ctrl+c;
9)SIGKILL:殺死正在運行的進程;
15)SIGTERM:終止正在運行的進程;
18)SIGCONT:繼續運行
19)SIGSTOP:后臺休眠
指定信號的方法:
(1)信號數字識別:1,2,3….
(2)信號的完整名稱:SIGHUP
(3)信號的簡寫名稱:HUP
kill命令:
使用kill命令終止進程時,需要使用進程的PID號作為參數;無特定選項信號時,kill命令將給該進程發送終止信號并正常退出,若該進程已經無法響應終止信號,則可以結合“-9”選項強行殺死進程。
示例:
[root@centos6 ~]# pgrep -l vim
5031 vim
[root@centos6 ~]# kill 5031
[root@centos6 ~]# pgrep -l vim
[root@centos6 ~]#
killall命令:
使用killall命令可以通過進程名來殺死進程,當需要結束系統中多個相同名稱的進程時,使用killall命令將更加方便,效率更高。killall命令也同樣可以結合“-9”選項以強制結束進程。
示例:
[root@centos6 ~]# vim f1
[1]+ Stopped vim f1 //crtl+z掛起至后臺
[root@centos6 ~]# pgrep -l vim
5297 vim
[root@centos6 ~]# killall -9 vim
[root@centos6 ~]# pgrep -l vim
[1]+ Killed vim f1 //已殺死vim進程
[root@centos6 ~]#
pkill命令:
使用pkill命令可以根據進程的名稱、運行該進程的用戶、進程所在的終端等多種屬性終止特定的進程,如“-U”指定用戶,“-t”指定終端等。
示例:
1)終止用戶zheng所在的終端:使用選項“-t”
[root@centos6 ~]# who
zheng tty2 2016-09-17 19:28
root tty1 2016-09-17 10:25 (:0)
root pts/1 2016-09-17 17:36 (:0.0)
[root@centos6 ~]# pkill -9 -t tty2
[root@centos6 ~]# who
root tty1 2016-09-17 10:25 (:0)
root pts/1 2016-09-17 17:36 (:0.0)
[root@centos6 ~]#
2)終止用戶zheng所在的終端:使用選項“-U”
[root@centos6 ~]# who
zheng tty2 2016-09-17 19:32
root tty1 2016-09-17 10:25 (:0)
root pts/1 2016-09-17 17:36 (:0.0)
[root@centos6 ~]# pkill -9 -U zheng
[root@centos6 ~]# who
root tty1 2016-09-17 10:25 (:0)
root pts/1 2016-09-17 17:36 (:0.0)
[root@centos6 ~]#
Linux的作業控制:
前臺作業:通過終端啟動,且啟動后一直占據終端;
后臺作業:可以通過終端啟動,但啟動后即轉入后臺運行
如何讓作業運行與后臺?
(1)運行中的作業可以執行:ctrl+z
(2)未啟動的作業可以執行:#command &
以上此類后臺作業雖然被送往后臺運行,但其依然與終端相關,退出終端,將關閉后臺作業,如果希望送往后臺后剝離與終端的關系可以執行以下命令:
#nohup command & #screen;command
示例: 使用nohup命令剝離后臺命令ping與終端的關系,即使斷網也會繼續運行。
[root@centos6 ~]# nohup ping 127.0.0.1 &
[1] 5886
[root@centos6 ~]# nohup: ignoring input and appending output to `nohup.out'
jobs命令:查看所有與終端相關的后臺運行的作業
jobs -l :查看所有后臺運行的作業;
示例:
[root@centos6 ~]# vim f1 &
[1] 5905
[root@centos6 ~]# jobs -l //查看所有后臺運行的作業;
[1]+ 5905 Stopped (tty output) vim f1
[root@centos6 ~]#
fg命令:可以將后臺的進程任務重新調入終端前臺執行;只需指定后臺任務對應的順序編號,可以通過jobs命令獲取。
示例:將后臺的vim f1調到前臺工作
[root@centos6 ~]# jobs -l
[1]+ 5905 Stopped (tty output) vim f1
[root@centos6 ~]# fg 1
bg命令:讓送往后臺的作業在后臺繼續運行;
示例:
[root@centos6 ~]# ping 127.0.0.1
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.046 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.041 ms
64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.054 ms
^Z //ctrl+z 調到后臺
[2]+ Stopped ping 127.0.0.1
[root@centos6 ~]# bg 2 //把在后臺停止的ping在后臺運行起來
[2]+ ping 127.0.0.1 &
64 bytes from 127.0.0.1: icmp_seq=4 ttl=64 time=0.127 ms
[root@centos6 ~]# 64 bytes from 127.0.0.1: icmp_seq=5 ttl=64 time=0.055 ms
并行運行:
讓兩個或多個腳本同時運行,需寫腳本的絕對路徑,后必須加“&”符。
示例:
編寫3個循環腳本
[root@centos6 testdir]# cat f1.sh f2.sh f2.sh
#!/bin/bash
while true;do
echo "f1.sh"
sleep 1
done
#!/bin/bash
while true;do
echo "f2.sh"
sleep 1
done
#!/bin/bash
while true;do
echo "f2.sh"
sleep 1
done
[root@centos6 testdir]#
第一種并行運行腳本方法:
[root@centos6 testdir]# (/testdir/f1.sh&);(/testdir/f2.sh&);(/testdir/f3.sh&)
第二種并行運行腳本方法:
[root@centos6 testdir]{ /testdir/f1.sh&/testdir/f2.sh&/testdirf3.sh& }
第三種并行運行腳本方法:
編寫一個腳本,把f1、f2、f3腳本放進去。
[root@centos6 testdir]# cat all.sh
#!/bin/bash
#
/testdir/f1.sh&
/testdir/f2.sh&
/testdir/f3.sh&
[root@centos6 testdir
執行all.sh腳本并行處理f1、f2、f3腳本
[root@centos6 testdir]# source all.sh
nice命令:調整進程優先級
示例:
[root@centos6 testdir]# nice -n -10 ping 127.0.0.1
查看設定的優先級:
[root@centos6 testdir]# ps axo pid,comm,ni
renice命令:重新設定進程優先級
renice [-n] priority pid
計劃任務管理:
在Linux系統中,通過atd、crond這兩個系統服務實現一次性、周期性計劃任務的功能,并分別通過at、crontab命令進行計劃任務的設定。
使用at命令設置的計劃任務只在指定的時間點執行一次,有一個前提是,對應的系統服務at必須運行。
使用crontab命令設置的計劃任務可以按預設的周期重復執行,可以大大減輕重復設置系統管理任務的操作。有一個前提是,對應的系統服務crond必須運行。
at 命令:
at [options] TIME
常用選項:
-q:隊列
-l:查看當前系統中設置的at計劃任務列表,相當于atq
-d:刪除指定任務編號的作業,相當于atrm
-c:查看具體的作業任務。
-f:從指定的腳本文件中讀取任務
-m:強制at發郵件表示執行完畢
TIME:
HH:MM [yyyy-mm-dd]
noon midnight teattime
tomorrow
now+#{minutes hours days weeks}
ctrl+d:提交一次性計劃任務
at一次性計劃任務:
執行方式:
1)交互式 2)輸入重定向 3)at -f scriptsfile
依賴atd服務,需要啟動才能實現at一次性計劃任務
at隊列存放在/var/spool/at目錄中
/etc/at.{allow ,deny}控制用戶是否能執行at任務
白名單:/etc/at.allow默認不存在,只有該文件中的用戶才能執行at命令
黑名單:/etc/at.deny拒絕該文件中的用戶執行at命令,而沒有在at.deny文件中的用戶可以執行at命令。
如果兩個文件都不存在,則只有root可以執行at命令。
at命令:執行的一次性計劃任務是存放在/var/spool/at目錄下的
示例:
[root@centos6 at]# at 15:22
at> wall hello
at> <EOT>
job 6 at 2016-09-18 15:22
[root@centos6 at]# pwd
/var/spool/at
[root@centos6 at]# ls
a000060176e77a spool
[root@centos6 at]#
at命令的“-f”選項:從指定的腳本文件中讀取任務。
示例:
[root@centos7 testdir]# cat sum100.sh
#!/bin/bash
echo "==============================="
i=1
sum=0
while [ $i -le 100 ];do
let sum=$sum+$i
let i++
done
echo "1 to 100 sum :$sum"
echo "=============================="
unset i
unset sum
[root@centos7 testdir]#
[root@centos7 ~]# at 3:45 -f /testdir/sum100.sh
job 3 at Sun Sep 18 03:45:00 2016
[root@centos7 ~]#
注: at的執行結果需去mail郵件中查看。
注意:作業執行命令的結果中的“標準輸出”和“錯誤輸出”以郵件通知給相關用戶。
示例:
[root@centos7 ~]# at 3:05
at> wall “da jia hao”
at> echo “at test”
at> <EOT> //ctrl+d提交計劃任務
job 2 at Sun Sep 18 03:05:00 2016
[root@centos7 ~]# at -l
2 Sun Sep 18 03:05:00 2016 a root
[root@centos7 ~]#
Broadcast message from root@centos7 (Sun Sep 18 03:05:01 2016):
da jia hao
You have new mail in /var/mail/root //echo執行的結果是標準輸出,所以有郵件通知
[root@centos7 ~]#
crontab周期性計劃任務
使用crontab命令設置的計劃任務可以按預設的周期重復執行,可以大大減輕重復設置系統管理任務的操作。有一個前提是,對應的系統服務crond必須運行。
centos7:systemctl status crond
centos6:service crond status
周期性計劃任務提交給crond,到指定的時間會自動運行。
系統crond任務:系統維護計劃任務
/etc/crontab
用戶crond任務:
crontab命令
日志:/var/log/cron
用戶自行定義的cron任務將被保存在目錄“/var/spool/cron”中,文件名與對應的用戶賬號同名。
用戶crontab周期性計劃任務
crontab命令定義,每個用戶都有專用的cron任務文件:
/var/spool/cron/USERNAME
crontab命令語法:
crontab [options]
-u:僅root可以運行,指定用戶管理cron任務;
-e:編輯計劃任務;
-r:刪除計劃任務;
-l:顯示計劃任務列表;
-i:同“-r”一同使用,已交互模式移除指定的計劃任務;
crontab計劃任務時間表示法:
(1)特定值:給定時間點有效取值范圍內的值
(2)*:表示“每”
(3)離散值:#,#,# 例如:1,3,5,9
(4)連續值:#-# 例如:2-6
(5)在指定的時間范圍上,定義步長 /#:#即為步長,例如:*/5
時間格式:
@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 * * * *
sleep命令:
sleep NUMBER [SUFFIX]…
SUFFIX:
s:秒,默認
m:分
h:小時
d:天
usleep:微秒;
注意:
運行結果的標準輸出和錯誤輸出以郵件通知給相關的用戶。
command > /dev/null
command &> /dev/null
對于cron任務來說,%有特殊的用途;如果在命令中要使用%,則需要轉義,不過,如果把%放置在單引號中,也可以不用轉義。
系統cron任務:/etc/crontab
示例:晚上9點10分以zheng用戶執行一個echo “hello”
1 SHELL=/bin/bash
2 PATH=/sbin:/bin:/usr/sbin:/usr/bin
3 MAILTO=root
4 HOME=/
5
6 # For details see man 4 crontabs
7
8 # Example of job definition:
9 # .—————- minute (0 – 59)
10 # | .————- hour (0 – 23)
11 # | | .———- day of month (1 – 31)
12 # | | | .——- month (1 – 12) OR jan,feb,mar,apr …
13 # | | | | .—- day of week (0 – 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
14 # | | | | |
15 # * * * * * user-name command to be executed
10 9 * * * zheng /bin/echo “hello”
用戶cron任務:crontab -e
[root@centos6 ~]# crontab -e
22 20 * * * /bin/echo "hello"
0 0 * * * /sbin/shutdown -h now
示例:執行用戶計劃任務,讓其到點休眠1分鐘,在執行wall
[root@centos6 ~]# crontab -e
16 21 * * * /bin/sleep 1m;/usr/bin/wall "hello"
原創文章,作者:zhengyibo,如若轉載,請注明出處:http://www.www58058.com/48353