八、進程、計劃任務及Shell腳本進階

一、進程基本概念

???????????程序是靜態(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)及轉(zhuǎn)換示意圖

三、進程的基本形態(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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容