洛谷P1852 跳跳棋
12Linux之程序管理
目錄- 12Linux之程序管理
- 12 程序管理
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原理就類似製造孤兒程序