天天看點

正式班D23

2020.11.05星期四  正式班D23

目錄

  • 12.3.3 HUP信号

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原理就類似制造孤兒程序