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