一、進程基本概念
???????????程序是靜態(tài)概念,本身作為一種軟件資源長期保存;而進程是程序的執(zhí)行過程,它是動態(tài)概念,有一定的生命期,是動態(tài)產(chǎn)生和消亡的。
???????????內(nèi)核功用:進程管理、文件系統(tǒng)、網(wǎng)絡功能、內(nèi)存管理、驅(qū)動程序、安全功能等
- Process: 運行中程序的一個副本,是被載入內(nèi)存的一個指令集合
- 進程ID(Process ID,PID)號碼被用來標記各個進程
- UID、GID、和SELinux語境決定對文件系統(tǒng)的存取和訪問權(quán)限
- 通常從執(zhí)行進程的用戶來繼承
- 存在生命周期
二、進程的基本狀態(tài)
- 創(chuàng)建狀態(tài):進程在創(chuàng)建時需要申請一個空白PCB(process control block進程控制塊),向其中填寫控制和管理進程的信息,完成資源分配。如果創(chuàng)建工作無法完成,比如資源無法滿足,就無法被調(diào)度運行,把此時進程所處狀態(tài)稱為創(chuàng)建狀態(tài)
- 就緒狀態(tài):進程已準備好,已分配到所需資源,只要分配到CPU就能夠立即運行
- 執(zhí)行狀態(tài):進程處于就緒狀態(tài)被調(diào)度后,進程進入執(zhí)行狀態(tài)
- 阻塞狀態(tài):正在執(zhí)行的進程由于某些事件(I/O請求,申請緩存區(qū)失?。┒鴷簳r無法運行,進程受到阻塞。在滿足請求時進入就緒狀態(tài)等待系統(tǒng)調(diào)用
- 終止狀態(tài):進程結(jié)束,或出現(xiàn)錯誤,或被系統(tǒng)終止,進入終止狀態(tài)。無法再執(zhí)行

三、進程的基本形態(tài)
- 運行態(tài):running
- 就緒態(tài):ready
- 睡眠態(tài):
可中斷:interruptable
不可中斷:uninterruptable - 停止態(tài):stopped,暫停于內(nèi)存,但不會被調(diào)度,除非手動啟動
- 僵死態(tài):zombie,結(jié)束進程,父進程結(jié)束前,子進程不關(guān)閉
四、進程基本管理
ps命令: 打印進程的快照信息
語法:ps [OPTION]...
- 支持三種選項:
UNIX選項 如-A -e
BSD選項 如a
GNU選項 如--help
選項:默認顯示當前終端中的進程
a 選項包括所有終端中的進程
x 選項包括不鏈接終端的進程
u 選項顯示進程所有者的信息
f 選項顯示進程樹,相當于 --forest
k|--sort 屬性 對屬性排序,屬性前加- 表示倒序
o 屬性… 選項顯示定制的信息 pid、cmd、%cpu、%mem
L 顯示支持的屬性列表
-C cmdlist 指定命令,多個命令用,分隔
-L 顯示線程
-e: 顯示所有進程,相當于-A
-f: 顯示完整格式程序信息
-F: 顯示更完整格式的進程信息
-H: 以進程層級格式顯示進程相關(guān)信息
-u userlist 指定有效的用戶ID或名稱
-U userlist 指定真正的用戶ID或名稱
-g gid或groupname 指定有效的gid或組名稱
-G gid或groupname 指定真正的gid或組名稱
-p pid 顯示指pid的進程
--ppid pid 顯示屬于pid的子進程
-M 顯示SELinux信息,相當于Z
ps 輸出屬性
- VSZ: Virtual memory SiZe,虛擬內(nèi)存集,線性內(nèi)存
- RSS: ReSident Size, 常駐內(nèi)存集
- STAT:進程狀態(tài)
R:running(運行)
S: interruptable sleeping(可中斷的睡眠)
D: uninterruptable sleeping(不可終端的睡眠)
T: stopped(停止)
Z: zombie(僵尸)
+: 前臺進程
l: 多線程進程
L:內(nèi)存分頁并帶鎖
N:低優(yōu)先級進程
<: 高優(yōu)先級進程
s: session leader,會話(子進程)發(fā)起者
ni: nice值
pri: priority 優(yōu)先級
psr: processor CPU編號
rtprio: 實時優(yōu)先級
示例1:查詢自身擁有的所有進程
ps -x
結(jié)果:
PID TTY STAT TIME COMMAND
1 ? Ss 0:03 /usr/lib/systemd/systemd --switched-root --system --deseriali
2 ? S 0:00 [kthreadd]
3 ? S 0:00 [ksoftirqd/0]
5 ? S< 0:00 [kworker/0:0H]
示例2:顯示統(tǒng)計占用系統(tǒng)內(nèi)存最多的進程,并排序。
ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem | head -2
結(jié)果:
PID PPID CMD %MEM %CPU
7871 7869 db2sysc 0 21.4 0.2
示例3:顯示統(tǒng)計占用系統(tǒng)CPU最多的進程,并排序。
ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%cpu | head -2
結(jié)果:
PID PPID CMD %MEM %CPU
7871 7869 db2sysc 0 21.4 0.2
五、Shell流程控制
編程中的邏輯處理:
- 順序執(zhí)行
- 選擇執(zhí)行
- 循環(huán)執(zhí)行
5.1 循環(huán)執(zhí)行
- 將某代碼段重復運行多次
- 重復運行多少次
- 循環(huán)次數(shù)事先已知
- 循環(huán)次數(shù)事先未知
- 具備進入條件和退出條件
for, while
for循環(huán)
for 變量名 in 列表;do
循環(huán)體
done
執(zhí)行機制:
依次將列表中的元素賦值給“變量名”; 每次賦值后即執(zhí)行一次循環(huán)體; 直到列表中的元素耗盡,循環(huán)結(jié)束
for示例:實現(xiàn)192.168.0.0/24網(wǎng)段內(nèi),地址是否能夠ping通,若ping通則輸出"success!",若ping不通則輸出"fail!"
cat for_scanip_1.sh
#!/bin/bash
NETID=192.168.1
for HOSTID in {1..254};do
{
ping -c1 -W1 $NETID.$HOSTID &> /dev/null && echo "$NETID.$HOSTID is success." || echo "$NETID.$HOSTID is fail."
} &
done
執(zhí)行結(jié)果
192.168.1.1 is success.
192.168.1.2 is fail.
192.168.1.3 is fail.
192.168.1.4 is fail.
192.168.1.5 is fail.
192.168.1.6 is fail.
192.168.1.7 is fail.
192.168.1.8 is fail.
192.168.1.9 is fail.
……
while循環(huán)
語句:
while CONDITION; do
循環(huán)體
done
CONDITION:循環(huán)控制條件;進入循環(huán)之前,先做一次判斷;每一次循環(huán)之后會再次做判斷;條件為“true”,則執(zhí)行一次循環(huán);直到條件測試狀態(tài)為“false”終止循環(huán)
因此:CONDTION一般應該有循環(huán)控制變量;而此變量的值會在循環(huán)體不斷地被修正
進入條件:CONDITION為true
退出條件:CONDITION為false
while示例:實現(xiàn)192.168.0.0/24網(wǎng)段內(nèi),地址是否能夠ping通,若ping通則輸出"success!",若ping不通則輸出"fail!"
cat while_scanip.sh
#!/bin/bash
NETID=192.168.1.
seq 1 254 |while read HOSTID;do
ping -c1 -W1 $NETID$HOSTID &> /dev/null && echo $NETID$HOSTID is success. || echo $NETID$HOSTID is fail. &
done
執(zhí)行結(jié)果
192.168.1.1 is success.
192.168.1.100 is success.
192.168.1.102 is success.
192.168.1.107 is success.
192.168.1.101 is success.
192.168.1.32 is fail.
……
六、Linux 計劃任務
未來的某時間點執(zhí)行一次任務
- at 指定時間點,執(zhí)行一次性任務
- batch 系統(tǒng)自行選擇空閑時間去執(zhí)行此處指定的任務
周期性運行某任務
- cron
crontab命令:
語法:crontab [-u user] [-l | -r | -e] [-i]
選項:
-l 列出所有任務
-e 編輯任務
-r 移除所有任務
-i 與 -r 一同使用,以交互式模式移除指定任務
-u user 僅root可運行,指定用戶管理cron任務
時間表示法:
(1) 特定值
給定時間點有效取值范圍內(nèi)的值
(2) *
給定時間點上有效取值范圍內(nèi)的所有值
表示“每...”
(3) 離散取值
#,#,#
(4) 連續(xù)取值
#-#
(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 * * * *
示例1:創(chuàng)建一個定時任務,要求每周的工作日1:30,將/etc備份至/backup目錄中,保存的文件名稱格式 為“etcbak-yyyy-mm-dd-HH.tar.xz”,其中日期是前一天的時間
crontab -e
30 1 * * 1-5 tar -Jcvf /backup/etcbak-$(date -d '1 days ago' +%F-%H).tar.xz /etc
檢查結(jié)果:
crontab -l
30 1 * * 1-5 tar -Jcvf /backup/etcbak-$(date -d '1 days ago' +%F-%H).tar.xz /etc
示例2:工作日時間,每10分鐘執(zhí)行一次磁盤空間檢查,一旦發(fā)現(xiàn)任何分區(qū)利用率高 于80%,就發(fā)送郵件報警.
crontab -e
*/10 * * 1-5 /root/while_read_check.sh
檢查結(jié)果:
crontab -l
*/10 * * * 1-5 /root/while_read_check.sh
cat /root/while_read_check.sh
#!/bin/bash
warn=10
df|sed -rn '/^\/dev\/sd/s#^([^[:space:]]+).* ([[:digit:]]+)%.*$#\1 \2#p'|while read part use;do
if [ $use -gt $warn ];then
echo "$part will be full.use:$use" |mail -s 'Disk usage monitor.' root &> /dev/null
fi
done