1. 程式人生 > 實用技巧 >洛谷P1852 跳跳棋

洛谷P1852 跳跳棋

12Linux之程序管理

目錄

12 程序管理

12.1 程序概念

12.1.1 什麼是程序?

  • 程式:存放程式碼的檔案-->靜態

    程序:程式的執行過程-->動態(程序是作業系統最核心的概念)

    ​ 作業系統控制著硬體去執行程式的過程

  • 併發:多個任務看起來是同時執行的

    並行:多個任務是真正的同時執行,只有多核才能實現並行

  • 執行緒:程序內程式碼的執行過程,一個程序至少有一個執行緒

    ​ 執行緒才是CPU的執行單位

    Tips:CPU是執行程式碼,不是做I/O的

  • 一個程序的多個執行緒共享該程序的記憶體資源

    不同程序的多個執行緒的記憶體資源互相隔離

  • 提交任務的方式:

    同步:在原地等

    非同步:不在原地等

12.1.2 程序狀態

  • 程序

    1、正在執行的程式

    2、正在計算機上執行的程式例項

    3、能分配處理器並由處理器執行的實體

    程序的兩個基本元素是程式程式碼和程式碼相關聯的資料集。程序是一種動態描述,但不代表所有的程序都在執行,程序在記憶體中會有各種狀態。

  • 程序狀態

    R  # 可執行狀態(執行狀態)
    S  # 可中斷睡眠狀態(sleeping)
    D  # 不可中斷睡眠(disk sleep)
    T  # 暫停狀態
    z  # 僵死狀態
    X  # 死亡狀態或退出狀態(dead)
    
  • 程序狀態切換

    # 三種狀態
    # 就緒態:程序已分配到除CPU以外的所有必要資源,只要獲得處理機便可執行
    # 執行態(Running):程序已獲得處理機,其程式正在處理機上執行
    # 阻塞態(Blocked):正在執行的程序,由於等待某個事件發生而無法執行時,就放棄處理機進入阻塞態。例如I/O、申請緩衝區不能滿足、等待訊號(信件)等
    
    # 狀態切換
    就緒->執行
    處在就緒態的程序,當排程器為其分配了處理機後就變成了執行態
    
    執行->就緒
    執行態的程序在其執行過程中,時間片跑完了不得不讓出處理機,從執行態變成就緒態
    
    執行->阻塞
    正在執行的程序等待某種事件而無法繼續執行時,便從執行態變成阻塞態
    
    阻塞->就緒
    處於阻塞態的程序,等待的事件結束,就從阻塞態變成就緒態
    

12.2 檢視程序資訊

12.2.1 ps aux

  • 檢視程序使用者、PID、佔用CPU百分比、佔用記憶體百分比、狀態、執行的命令等

    -a  # 顯示一個終端的所有程序
    -u  # 選擇有效的使用者ID或使用者名稱
    -x  # 顯示沒有控制終端的程序,同時顯示各個命令的具體路徑
    
    [root@ccc ~]# ps aux | head -5
    USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
    root          1  0.0  0.3 125356  3792 ?        Ss   14:43   0:01 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
    root          2  0.0  0.0      0     0 ?        S    14:43   0:00 [kthreadd]
    root          4  0.0  0.0      0     0 ?        S<   14:43   0:00 [kworker/0:0H]
    root          6  0.0  0.0      0     0 ?        S    14:43   0:00 [ksoftirqd/0]
    
    USER 	 # 進行程序的使用者
    PID  	 # 程序ID
    %CPU 	 # CPU佔用率
    %MEN 	 # 記憶體佔用率
    VSZ   	 # 佔用虛擬記憶體(kb),表示已分配的記憶體空間大小,不等於實際用到的記憶體大小
    RSS  	 # 佔用實際記憶體(kb),常駐記憶體大小,即程序實際佔用的實體記憶體大小
    TTY  	 # 程序執行的終端
    STAT  	 # 程序狀態
    START 	 # 程序的啟動時間
    TIME	 # 程序佔用CPU的總時間
    COMMAND  # 程序檔案,程序名。帶[]代表核心態程序,不帶[]代表使用者態程序
    
  • STAT程序狀態

    R  # 執行
    S  # 可中斷睡眠sleep,即在睡眠的過程中可以接收訊號喚醒->執行的I/O操作能得到硬體裝置的相應
    D  # 不可中斷睡眠,即在睡眠的過程中不可以接收訊號喚醒->執行的I/O操作得不到硬體裝置的響應
    T  # 停止的程序
    Z  # 殭屍程序
    X  # 死掉的程序(幾乎看不見,死掉會被立即回收)
    <  # 優先順序較高的程序
    N  # 優先順序較低的程序
    s  # 包含子程序
    +  # 是前臺的程序組
    l  # 小寫字母l代表以執行緒的方式執行,即多執行緒
    |  # 多程序
    
  • 兩種睡眠狀態

    # 1、可中斷睡眠狀態(S) Interrupt Sleep
    處於這種睡眠狀態的程序是可以通過給他傳送signal來喚醒的。
    如HUP訊號給nginx的master程序,可以讓nginx重新載入配置檔案而不需要重新啟動nginx程序。
    # 2、不可中斷睡眠(D) Uninterruptible Sleep
    處於這種狀態的程序不接受任何外來的signal
    包括但不限於kill、kill -9、kill -15、ctrl+c、ctrl+z
    
    # 解釋
    處於D狀態是因為程序長時間等待I/O都沒有響應,且被ps看到,意味著可能I/O出現問題或外設本身出現問題或NFS掛載的遠端檔案系統不可訪問。
    只有等待I/O恢復或者重啟整個Linux系統才能從D狀態恢復。
    
    # 強調
    D不可中斷睡眠狀態和Z殭屍程序都不可以用kill -9殺死
    

12.2.2 ps -elf

  • 檢視ppid

  • ps -ef只打印程序,而ps -elf會列印所有的執行緒,同時加了兩列。

    [root@ccc ~]# ps -ef | head -10
    UID         PID   PPID  C STIME TTY          TIME CMD
    root          1      0  0 14:43 ?        00:00:01 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
    root          2      0  0 14:43 ?        00:00:00 [kthreadd]
    root          4      2  0 14:43 ?        00:00:00 [kworker/0:0H]
    root          6      2  0 14:43 ?        00:00:00 [ksoftirqd/0]
    root          7      2  0 14:43 ?        00:00:00 [migration/0]
    root          8      2  0 14:43 ?        00:00:00 [rcu_bh]
    root          9      2  0 14:43 ?        00:00:00 [rcu_sched]
    root         10      2  0 14:43 ?        00:00:00 [lru-add-drain]
    root         11      2  0 14:43 ?        00:00:00 [watchdog/0]
    [root@ccc ~]# ps -elf | head -10
    F S UID         PID   PPID  C PRI  NI ADDR SZ WCHAN  STIME TTY          TIME CMD
    4 S root        1     0  0  80   0 - 31339 ep_pol 14:43 ?        00:00:01 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
    1 S root        2     0  0  80   0 -     0 kthrea 14:43 ?        00:00:00 [kthreadd]
    1 S root        4     2  0  60 -20 -     0 worker 14:43 ?        00:00:00 [kworker/0:0H]
    1 S root        6     2  0  80   0 -     0 smpboo 14:43 ?        00:00:00 [ksoftirqd/0]
    1 S root        7     2  0 -40   - -     0 smpboo 14:43 ?        00:00:00 [migration/0]
    1 S root        8     2  0  80   0 -     0 rcu_gp 14:43 ?        00:00:00 [rcu_bh]
    1 R root        9     2  0  80   0 -     0 -      14:43 ?        00:00:00 [rcu_sched]
    1 S root       10     2  0  60 -20 -     0 rescue 14:43 ?        00:00:00 [lru-add-drain]
    5 S root       11     2  0 -40   - -     0 smpboo 14:43 ?        00:00:00 [watchdog/0]
    

12.2.3 pstree程序樹

  • 檢視程序樹

    [root@ccc ~]# rpm -qf `which pstree`
    psmisc-22.20-16.el7.x86_64
    [root@ccc ~]# pstree
    systemd─┬─NetworkManager───2*[{NetworkManager}]
            ├─VGAuthService
            ├─agetty
            ├─auditd───{auditd}
            ├─chronyd
            ├─crond
            ├─dbus-daemon
            ├─master─┬─pickup
            │        └─qmgr
            ├─nginx───nginx
            ├─polkitd───6*[{polkitd}]
            ├─rsyslogd───2*[{rsyslogd}]
            ├─sshd───sshd───bash───pstree
            ├─systemd-journal
            ├─systemd-logind
            ├─systemd-udevd
            ├─tuned───4*[{tuned}]
            └─vmtoolsd───{vmtoolsd}
    [root@ccc ~]# pstree 4032
    nginx───nginx
    
  • 檢視某一個使用者的所有程序

    ps -l -u使用者

12.2.4 top動態檢視

  • 基本用法(-d -p -u)

    [root@ccc ~]# top
    [root@ccc ~]# top -d 1  # 1秒重新整理一次,也可top後進介面用s修改
    [root@ccc ~]# top -d 1 -p 程序的PID
    [root@ccc ~]# top -d 1 -p `pgrep nginx`
    [root@ccc ~]# top -d 1 -p `pgrep nginx | head -1`,33  # 檢視sshd及PID33的程序
    [root@ccc ~]# top -d 1 -u cjx  # 檢視指定使用者的程序
    [root@ccc ~]# top -b -n 2 > top.txt  # 將兩次top的資訊寫入檔案
    
  • 顯示資訊解釋

    [root@ccc ~]# top
    top - 14:36:59 up 3:38, 2 users, load average: 0.00, 0.01, 0.05
    Tasks: 93 total,  1 running, 92 sleeping,  0 stopped,  0 zombie
    %Cpu(s):0.0 us,0.3 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
    KiB Mem: 995684 total, 633360 free, 119908 used, 242416 buff/cache
    KiB Swap: 1952764 total, 1952764 free,   0 used. 726976 avail Mem 
    
    # 系統整體統計資訊部分
    14:36:59 up 3:38  # up左邊是當前的時間,右邊是執行的時常
    load average: 0.00, 0.01, 0.05  # CPU1分鐘、5分鐘、15分鐘的平均負載
    us  # 使用者態程序佔用CPU時間的佔比
    sy  # 核心態程序佔用CPU時間的佔比(兩者相加最高100)
    ni  # 高優先度程序佔CPU時間百分比
    id  # cpu空閒的百分比
    wa  # cpu等待io的百分比
    hi  # 硬體中斷,處理硬體中斷所佔用的時間
    si  # 軟體中斷,處理軟體中斷佔用的時間
    st  # 被偷走的cpu
    
    # 平均負載
    單位時間內,系統處於可執行狀態和不可中斷狀態的平均程序數(平均活躍程序數)
    # 平均負載相關基礎
    核心數為2,平均負載為2,此時cpu剛好被完全佔用
    核心數為4,平均負載為2,此時有一半(50%)的CPU是空閒狀態
    核心數為1,平均負載為2,此時至少一半的程序搶不到CPU
    
    
    PID  USER   PR  NI    VIRT   RES  SHR S %CPU %MEM   TIME+  COMMAND   
    4861 root   20   0  162092  2204 1556 R  0.3  0.2   0:00.01 top 
       1 root   20   0  125484  3912 2600 S  0.0  0.4   0:01.26 systemd 
       2 root   20   0     0      0     0 S  0.0  0.0   0:00.00  kthreadd
    
    # 程序資訊部分
    VIRT  # virtual memory usage虛擬記憶體
    RES   # resident memory usage常駐記憶體
    SHR   # shared memory共享記憶體
    DATA  # 資料佔用的記憶體(可用f空格選中DATA專案q退出)
    
  • 內部命令控制顯示方式

    M 	 # 按記憶體使用降序排序
    P  	 # 根據CPU降序排序
    N 	 # 根據PID降序排序
    R 	 # 反序
    f 	 # 增加顯示欄位,空格勾選
    1  	 # 顯示所有CPU的負載
    s  	 # 更改頻率
    z    # 更改顏色
    h/?  # 幫助
    <    # 向前
    >    # 向後
    k    # 給程序發訊號,根據PID殺死程序
    
  • 調整程序的優先順序

    r  # 調整程序的優先順序(Nice Level)
    # 優先順序的數值為-20~19
    # 好人值越小優先順序越高,越大越低,-20優先順序最高,19優先順序最低
    # 普通使用者只能
    

12.3 管理程序

12.3.1 優先順序設定

  • 在啟動程序時用nice命令設定優先順序

    # 1、命令
    nice [-n 優先順序]
    
    # 2、選項介紹
    -n 優先順序   # 指定優先順序
    --help	   # 幫助資訊
    --version  # 版本資訊
    
  • 對已執行的程序設定新的優先順序

    [root@ccc ~]# renice -20 11111
    

12.3.2 給程序發訊號kill

  • kill -l

    [root@ccc ~]# kill -l
     1) SIGHUP	 2) SIGINT	 3) SIGQUIT	 4) SIGILL	 5) SIGTRAP
     6) SIGABRT	 7) SIGBUS	 8) SIGFPE	 9) SIGKILL	10) SIGUSR1
    11) SIGSEGV	12) SIGUSR2	13) SIGPIPE	14) SIGALRM	15) SIGTERM
    16) SIGSTKFLT	17) SIGCHLD	18) SIGCONT	19) SIGSTOP	20) SIGTSTP
    21) SIGTTIN	22) SIGTTOU	23) SIGURG	24) SIGXCPU	25) SIGXFSZ
    26) SIGVTALRM	27) SIGPROF	28) SIGWINCH	29) SIGIO	30) SIGPWR
    31) SIGSYS	34) SIGRTMIN	35) SIGRTMIN+1	36) SIGRTMIN+2	37) SIGRTMIN+3
    38) SIGRTMIN+4	39) SIGRTMIN+5	40) SIGRTMIN+6	41) SIGRTMIN+7	42) SIGRTMIN+8
    43) SIGRTMIN+9	44) SIGRTMIN+10	45) SIGRTMIN+11	46) SIGRTMIN+12	47) SIGRTMIN+13
    48) SIGRTMIN+14	49) SIGRTMIN+15	50) SIGRTMAX-14	51) SIGRTMAX-13	52) SIGRTMAX-12
    53) SIGRTMAX-11	54) SIGRTMAX-10	55) SIGRTMAX-9	56) SIGRTMAX-8	57) SIGRTMAX-7
    58) SIGRTMAX-6	59) SIGRTMAX-5	60) SIGRTMAX-4	61) SIGRTMAX-3	62) SIGRTMAX-2
    63) SIGRTMAX-1	64) SIGRTMAX	
    
  • 常用選項

    HUP(1)   	 # 1、掛起訊號 2、讓程序重新載入配置
    KILL(9)  	 # 立即結束程式的執行
    TERM(15)   	 # 終止,是不帶引數的kill預設訊號,殺死程序
    
    CONT(18) 	 # 被暫停的程序恢復執行
    SIGSTOP(19)  # 暫停程序
    
  • 殺死所有(killall pkill)

    [root@ccc ~]# vim ccc.txt &
    [1] 5108
    [root@ccc ~]# vim ccc.txt &
    [2] 5109
    [1]+  已停止               vim ccc.txt
    [root@ccc ~]# killall -9 vim
    [1]-  已殺死               vim ccc.txt
    [2]+  已殺死               vim ccc.txt
    [root@ccc ~]# vim ccc.txt &
    [1] 5123
    [root@ccc ~]# vim ccc.txt &
    [2] 5124
    [1]+  已停止               vim ccc.txt
    [root@ccc ~]# pkill -9 vim
    [1]-  已殺死               vim ccc.txt
    [2]+  已殺死               vim ccc.txt
    
  • 檢視某個使用者開啟的程序

    [root@ccc ~]# pgrep -l -u cjx
    

12.3.3 HUP訊號

  • 在關閉終端時,終端會收到Linux HUP訊號(hangup訊號),關閉其所有子程序。

  • 想讓程序一直在後臺執行不受關閉終端的影響,有以下四種方案:

    nohup

    在命令前加上nohup,就會從終端解除程序的關聯

    同時在結尾加上&來將命令放入後臺執行

    # 1、在終端1輸入
    [root@ccc ~]# nohup ping baidu.com &>/dev/null &
    [root@ccc ~]# ps -elf | grep [p]ing  # 檢視程序
    4 S root       2034   1979  0  80   0 - 37522 poll_s 15:11 pts/4    00:00:00 ping baidu.com
                
    # 2、關閉終端1
    
    # 3、在終端2檢視
    [root@ccc ~]# ps -elf | grep [p]ing  # 檢視程序,父程序變為1即systemd程序
    4 S root       2034      1  0  80   0 - 37522 poll_s 15:11 ?        00:00:00 ping baidu.com
    

    setsid

    原理與nohup一致,但setsid直接將程序的父PID設為1,即讓執行的程序歸屬init的子程序

    除非init結束,該子程序才會結束。當前終端結束不會影響程序的執行

    # 1、在終端1執行命令
    [root@ccc ~]# setsid ping baidu.com &>/dev/null &
    [1] 2062
    [root@ccc ~]# ps -elf | grep [p]ing
    4 S root       2063      1  0  80   0 - 37522 poll_s 15:19 ?        00:00:00 ping baidu.com
    [1]+  完成                  setsid ping baidu.com &>/dev/null
    
    # 2、關閉終端1
    
    # 3、在終端2檢視
    [root@ccc ~]# ps -elf | grep [p]ing
    4 S root       2063      1  0  80   0 - 37522 poll_s 15:19 ?        00:00:00 ping baidu.com
    

    在子shell中啟動程序

    命令加上括號

    # 1、在終端1輸入命令
    [root@ccc ~]# (ping vaidu.com &>/dev/null &)
    [root@ccc ~]# ps -elf | grep [p]ing
    4 S root       2103      1  0  80   0 - 37522 poll_s 15:24 pts/4    00:00:00 ping vaidu.com
    
    # 2、關閉終端1
    
    # 3、在終端2檢視
    [root@ccc ~]# ps -elf | grep [p]ing
    4 S root       2103      1  0  80   0 - 37522 poll_s 15:24 ?        00:00:00 ping vaidu.com
    

    screen

    讓程序執行在新的會話裡,從而成為不屬於此終端的子程序,關閉終端不會被帶走

    # 安裝screen
    [root@ccc ~]# yum install screen -y
    
    # 用法1
    # 執行命令
    終端1輸入命令
    [root@ccc ~]# screen vim 111.py
    [root@ccc ~]# ps -elf | grep [v]im
    4 S root 2154 2076 0 80 0 - 31934 sys_pa 15:43 pts/6 00:00:00 screen vim 111.py
    5 S root 2155 2154 0 80 0 - 31967 poll_s 15:43 ?     00:00:00 SCREEN vim 111.py
    4 S root 2156 2155 0 80 0 - 37444 poll_s 15:43 pts/2 00:00:00 vim 111.py
                
    關閉終端1
    
    在終端2檢視
    [root@ccc ~]# ps -elf | grep [v]im
    5 S root       2155      1  0  80   0 - 31967 poll_s 15:43 ?        00:00:00 SCREEN vim 111.py
    4 S root       2156   2155  0  80   0 - 37444 poll_s 15:43 pts/2    00:00:00 vim 111.py
    
    # 重新連線會話
    [root@ccc ~]# screen -ls
    There are screens on:
    	2155.pts-6.ccc	(Detached)
    	1678.pts-0.ccc	(Attached)
    2 Sockets in /var/run/screen/S-root.
    [root@ccc ~]# screen -r 2155
    
    # 用法2
    # 執行命令
    [root@ccc ~]# screen -S cjx_pm
    # screen會建立一個執行shell的全屏視窗。可執行任意shell程式
    # 輸入exit退出該視窗(若該screen視窗唯一,則screen會話結束,否則切換到前一視窗)
    
    # 重新連線會話
    [root@ccc ~]# screen -r cjx_pm
    # 已經指定了名字,可以不用程序ID直接用名字
    
    # 測試
    [root@ccc ~]# screen
    [root@ccc ~]# n=1;while true;do echo $n;sleep 1;((n++));done;
    按下ctrl+a和ctrl+d
    此時整個終端關閉,程序並未結束
    [root@ccc ~]# screen -ls
    There are screens on:
    	2266.pts-4.ccc	(Detached)
    Remove dead screens with 'screen -wipe'.
    1 Sockets in /var/run/screen/S-root.
    [root@ccc ~]# screen -r 2266  # 程序依舊在執行
    
    # 遠端演示
    在終端1
    [root@ccc ~]# screen -S cz
    
    在終端2執行的命令,終端1會同步顯示
    [root@ccc ~]# screen -x cz
    

12.4 檢視網路狀態

  • netstat

    [root@ccc ~]# netstat -tunlp
    Active Internet connections (only servers)
    Proto Recv-Q Send-Q Local Address       Foreign Address     State    PID/Program name    
    tcp        0      0 0.0.0.0:22          0.0.0.0:*           LISTEN   844/sshd            
    tcp        0      0 127.0.0.1:25        0.0.0.0:*           LISTEN   922/master          
    tcp6       0      0 :::22               :::*                LISTEN   844/sshd            
    tcp6       0      0 ::1:25              :::*                LISTEN   922/master          
    udp        0      0 127.0.0.1:323       0.0.0.0:*                    532/chronyd         
    udp6       0      0 ::1:323             :::*                         532/chronyd       
                            
    -t  # tcp協議
    -u  # udp協議
    -l  # listen
    -p  # PID/Program name
    -n  # 不反解,不將IP地址解析為主機名,不將埠號解析成協議名
    
  • lsof:列出開啟檔案(lists openfiles)

    預設 : 沒有選項,lsof列出活躍程序的所有開啟檔案
    組合 : 可以將選項組合到一起,如-abc,但要當心哪些選項需要引數
    -a : 結果進行“與”運算(而不是“或”)
    -l : 在輸出顯示使用者ID而不是使用者名稱
    -h : 獲得幫助
    -t : 僅獲取程序ID
    -U : 獲取UNIX套介面地址
    -F : 格式化輸出結果,用於其它命令。可以通過多種方式格式化,如-F pcfn(用於程序id、命令名、檔案描述符、檔名,並以空終止)
        
    # 1、安裝
    [root@ccc ~]# yum install -y lsof
    
    # 2、使用
    # -i顯示所有連線
    [root@ccc ~]# lsof -i
    COMMAND  PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
    chronyd  532 chrony    5u  IPv4  16273      0t0  UDP localhost:323 
    chronyd  532 chrony    6u  IPv6  16274      0t0  UDP localhost:323 
    sshd     844   root    3u  IPv4  19131      0t0  TCP *:ssh (LISTEN)
    sshd     844   root    4u  IPv6  19140      0t0  TCP *:ssh (LISTEN)
    master   922   root   13u  IPv4  19666      0t0  TCP localhost:smtp (LISTEN)
    master   922   root   14u  IPv6  19667      0t0  TCP localhost:smtp (LISTEN)
    sshd    2182   root    3u  IPv4  47242      0t0  TCP ccc:ssh->192.168.29.2:64066 (ESTABLISHED)
    # -i 6僅獲取IPV6流量
    [root@ccc ~]# lsof -i 6
    COMMAND PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
    chronyd 532 chrony    6u  IPv6  16274      0t0  UDP localhost:323 
    sshd    844   root    4u  IPv6  19140      0t0  TCP *:ssh (LISTEN)
    master  922   root   14u  IPv6  19667      0t0  TCP localhost:smtp (LISTEN)
    # -i:22僅獲取22埠的連線
    [root@ccc ~]# lsof -i:22
    COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
    sshd     844 root    3u  IPv4  19131      0t0  TCP *:ssh (LISTEN)
    sshd     844 root    4u  IPv6  19140      0t0  TCP *:ssh (LISTEN)
    sshd    2182 root    3u  IPv4  47242      0t0  TCP ccc:ssh->192.168.29.2:64066 (ESTABLISHED)
    # -i@host顯示指定到主機的連線
    # -i@host:port顯示基於主機與埠的連線
    # -u 使用者 顯示指定使用者打開了什麼
    # -u ^使用者 顯示除指定使用者外其他所有使用者做的事
    # kill -9 `lsof -t -u 使用者`  消滅指定使用者執行的所有東西
    # -c 命令  檢視指定的命令正在使用的檔案和網路連線
    # -p PID  檢視指定程序ID已開啟的內容
    # -t  只返回PID
    
  • netstat -an

    [root@ccc ~]# netstat -an 
    [root@ccc ~]# netstat -an | grep :22
    tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN     
    tcp        0     52 192.168.29.55:22        192.168.29.2:64066      ESTABLISHED
    tcp6       0      0 :::22                   :::*                    LISTEN  
    

12.5 proc檔案系統

12.5.1 檢視硬碟狀態df

  • 顯示目錄或檔案大小du

    [root@ccc ~]# du -sh /root
    96K	/root
    
  • 檢視硬碟狀態df

    [root@ccc ~]# df -h
    檔案系統        容量  已用  可用 已用% 掛載點
    devtmpfs        476M     0  476M    0% /dev
    tmpfs           487M     0  487M    0% /dev/shm
    tmpfs           487M  7.6M  479M    2% /run
    tmpfs           487M     0  487M    0% /sys/fs/cgroup
    /dev/sda3       7.7G  6.3G  1.5G   82% /
    /dev/sda1       473M  123M  351M   26% /boot
    tmpfs            98M     0   98M    0% /run/user/0
    
    [root@ccc ~]# df -T
    檔案系統       型別       1K-塊    已用    可用 已用% 掛載點
    devtmpfs       devtmpfs  487140       0  487140    0% /dev
    tmpfs          tmpfs     497840       0  497840    0% /dev/shm
    tmpfs          tmpfs     497840    7756  490084    2% /run
    tmpfs          tmpfs     497840       0  497840    0% /sys/fs/cgroup
    /dev/sda3      xfs      8034304 6529180 1505124   82% /
    /dev/sda1      xfs       484004  125552  358452   26% /boot
    tmpfs          tmpfs      99572       0   99572    0% /run/user/0
    

12.5.2 檢視記憶體狀態free

  • 記憶體:/proc/meminfo

    [root@ccc ~]# less /proc/meminfo 
    
  • free

    [root@ccc ~]# free
                  total        used        free      shared  buff/cache   available
    Mem:         995684      148580      454780        7756      392324      655336
    Swap:       1952764           0     1952764
    
    [root@ccc ~]# free -m
                  total        used        free      shared  buff/cache   available
    Mem:            972         145         444           7         383         639
    Swap:          1906           0        1906
    
    [root@ccc ~]# free -wm
                  total        used        free      shared     buffers       cache   available
    Mem:            972         144         444           7           2         381         640
    Swap:          1906           0        1906
    
    # free指當前完全沒有被程式使用的記憶體
    # cache在有需要的時候可以被釋放出來供其他程序使用(不是釋放所有)
    # available是真正表明系統目前提供給新啟動程式的記憶體
    
  • 釋放記憶體

    [root@ccc ~]# free
                  total        used        free      shared  buff/cache   available
    Mem:         995684      148580      454780        7756      392324      655336
    Swap:       1952764           0     1952764
    [root@ccc ~]# cat /proc/sys/vm/drop_caches 
    0
    [root@ccc ~]# echo 3>/proc/sys/vm/drop_caches
    [root@ccc ~]# free
                  total        used        free      shared  buff/cache   available
    Mem:         995684      148012      453520        7756      394152      655904
    Swap:       1952764           0     1952764
    
  • 核心啟動引數

    [root@ccc ~]# cat /proc/cmdline 
    BOOT_IMAGE=/vmlinuz-3.10.0-1127.el7.x86_64 root=UUID=b43c52c4-89a7-48d2-83e4-6e8d35553e64 ro spectre_v2=retpoline rhgb quiet LANG=zh_CN.UTF-8
    [root@ccc ~]# uptime
     17:29:15 up  6:35,  2 users,  load average: 0.00, 0.01, 0.05
    
  • 解除安裝/proc及重新掛載

    [root@ccc ~]# umount /proc/ -l  # 解除安裝
    [root@ccc ~]# free -m  # free -m、uptime、lscpu、toop都用不了
    Error: /proc must be mounted
      To mount /proc at boot you need an /etc/fstab line like:
          proc   /proc   proc    defaults
      In the meantime, run "mount proc /proc -t proc"
    [root@ccc ~]# mount -t proc proc /proc/  # 重新掛載
    

12.5.3 檢視CPU狀態lscpu

  • CPU:/proc/cpuinfo

    [root@ccc ~]# grep "processor" /proc/cpuinfo | wc -l  # 邏輯CPU個數
    1
    [root@ccc ~]# grep "physical id" /proc/cpuinfo | wc -l  # 物理CPU個數
    1
    [root@ccc ~]# grep "cpu cores" /proc/cpuinfo | wc -l  # CPU核數
    1
    [root@ccc ~]# cat /proc/cpuinfo   # 檢視cpu資訊
    [root@ccc ~]# lscpu
    

12.6 管理後臺程序(瞭解)

  • 瞭解即可

    [root@ccc ~]# sleep 5000 &  					# 後臺執行
    [1] 4487
    [root@ccc ~]# sleep 4000 						# 前臺執行
    ^Z												# ctrl+z停止
    [2]+  已停止               sleep 4000
    [root@ccc ~]# jobs								# []編號是作業編號
    [1]-  執行中               sleep 5000 &
    [2]+  已停止               sleep 4000
    [root@ccc ~]# bg %2								# 讓作業2在後臺執行
    [2]+ sleep 4000 &
    [root@ccc ~]# jobs
    [1]-  執行中               sleep 5000 &
    [2]+  執行中               sleep 4000 &
    [root@ccc ~]# fg %1								# 將作業1調回到前臺
    sleep 5000
    ^C												# ctrl+c終止
    [root@ccc ~]# jobs
    [2]+  執行中               sleep 4000 &
    [root@ccc ~]# kill %2							# 殺死作業2
    [root@ccc ~]# jobs
    [2]+  已終止               sleep 4000
    [root@ccc ~]# jobs
    

12.7 管道

12.7.1 管道概念

  • 管道用於程序間的通訊
  • 管道操作符號"|"主要用於連線左右兩個命令。將左邊的命令標準輸出,交給右側命令的標準輸入
  • 無法傳遞標準錯誤輸出至後者命令
  • 格式:cmd1 | cmd2[... | cmdn]

12.7.2 xargs

  • 引數傳遞,讓一些不支援管道的命令可以使用管道技術

    [root@ccc ~]# which cat
    /usr/bin/cat
    [root@ccc ~]# which cat | xargs ls -l
    -rwxr-xr-x. 1 root root 54080 8月  20 2019 /usr/bin/cat
    

12.7.3 例項

  • 統計當前/etc/passwd中使用者使用的shell型別

    [root@ccc ~]# awk -F: '{print $7}' /etc/passwd | sort | uniq -c
          4 /bin/bash
          1 /bin/sync
          1 /sbin/halt
         17 /sbin/nologin
          1 /sbin/shutdown
    
  • 列印當前所有的IP

    [root@ccc ~]# ip addr | grep 'inet' | awk '{print $2}' |awk -F"/" '{print $1}'
    127.0.0.1
    ::1
    192.168.29.55
    fe80::20c:29ff:fec0:5db3
    
  • 列印根分割槽已用空間百分比(僅數字)

    [root@ccc ~]# df -P | grep '/$' |awk '{print $5}' | awk -F"%" '{print $1}'
    82
    

12.7.4 管道中的tee技術

  • -a # 追加

    [root@ccc ~]# ip addr | grep 'inet' | awk '{print $2}' |awk -F"/" '{print $1}' | tee ip.txt
    127.0.0.1
    ::1
    192.168.29.55
    fe80::20c:29ff:fec0:5db3
    [root@ccc ~]# cat ip.txt 
    127.0.0.1
    ::1
    192.168.29.55
    fe80::20c:29ff:fec0:5db3
    
  • 重定向與tee的區別

    [root@ccc ~]# date > date.txt			# 直接將內容寫入到date.txt檔案中
    [root@ccc ~]# date | tee date.txt		# 執行結果輸出至螢幕,且儲存至檔案
    2020年 11月 05日 星期四 18:57:32 CST
    

12.8 殭屍程序與孤兒程序

12.8.1 殭屍程序

  • 作業系統負責管理程序,應用程式想開子程序都是在像作業系統傳送系統呼叫。

    當子程序死掉以後,作業系統會將子程序佔用的重型資源(如記憶體空間、cpu資源、開啟的檔案等)

    Linux的機制會保留子程序的程序號、退出狀態、執行時間等供父程序檢視

    殭屍程序是Linux系統的一種資料結構,所有子程序結束後都會進入殭屍程序的狀態

  • 父程序覺得殭屍程序的資料沒用以後,由父程序發起一個系統呼叫wait/waitpid來通知作業系統清理殭屍程序的殘餘狀態

    # 三種情況:
    # 1、Linux系統自帶的優秀的開源軟體,在開啟子程序時,父程序內部都會及時呼叫wait/waitpid來通知作業系統回收殭屍程序。因此我們通常看不到優秀開源軟體堆積殭屍程序,因為及時回收
    
    # 2、水平良好的程式設計師開發的應用程式,會在父程序內考慮呼叫wait/waitpid來通知作業系統回收殭屍程序,但發起系統呼叫時間可能慢一些,可以用命令看到殭屍程序狀態
    [root@ccc ~]# ps aux | grep [z]+
    
    # 3、垃圾程式設計師不知道殭屍程序是什麼,作業系統中就會堆積很多殭屍程序,會導致記憶體充足、硬碟充足、cpu空閒,但新軟體無法啟動起來的狀況。因為殭屍程序會佔用大量的PID
    針對情況三,只有殺死父程序,殭屍程序就會由pid為1的頂級程序(init或systend)接手,頂級程序會定期發起系統呼叫wait/waitpid來通知作業系統清理殭屍程序。
    針對情況二,可以傳送訊號給父程序,通知他發起系統呼叫清理殭屍程序
    kill -CHLD 父程序PID
    

12.8.2 孤兒程序

  • 父程序先死掉,而他的一個或多個子程序還在執行,這些子程序就會成為孤兒程序。
  • 孤兒程序會被PID為1的頂級程序接手
  • nohup、setsid原理就類似製造孤兒程序