卡住無法檢視到所有程序_程序管理Linux每日一練(6)
技術標籤:卡住無法檢視到所有程序
題目一:程序有哪幾種狀態(生命週期)?
平時學的是這五種狀態新建、就緒、執行、阻塞、終止,但是在Linux裡面可以檢視到的要更加詳細,如下命令的 STAT
列就是展示了狀態
$ps-aux
USERPID%CPU%MEMVSZRSSTTSTATSTARTEDTIMECOMMAND
root9817.30.047247482764??S五02下午73:31.27hexo
root795190.00.04277540728s007S+9:18下午0:00.00xxx
有很多狀態,就看首字母,其他不用在意太多
- R 執行
- S 可中斷睡眠 Sleep
- D 不可中斷睡眠 (usually IO)
- T 停止的程序
- Z 殭屍程序
- X 死掉的程序
題目二:通過 ps
命令我們可以獲取哪些關鍵資訊?
ps
命令一般是用來查 pid
的,我們就可以通過 kill
的方式幹掉程序,或者通過 pid
去讀取 /proc
目錄獲取程序監控資訊。
和 top
命令一樣,使用 ps -aux
引數,可以看到程序的各種指標
- USER: 執行程序的使用者
- PID: 程序 ID
- %CPU: CPU 佔用率
- %MEM: 記憶體佔用率
- VSZ: 佔用虛擬記憶體
- RSS: 佔用實際記憶體 駐留記憶體
- TTY: 程序執行的終端
- STAT: 程序狀態 man ps (/STATE)
- STARTED: 啟動日期
- TIME: 執行時間
- COMMAND: 啟動命令
當然,如果只是想檢視下pid,可以直接 pgrep 程序名
$pgrepsshd
10180
題目三:top
命令怎麼根據 cpu
、 mem
排序?通過此命令我們還能獲取哪些關鍵資訊?
使用 uptime
可以檢視機器負載情況
$uptime
21:31up4days,6:54,3users,loadaverages:3.543.273.02
使用 top
可以臨時檢視程序的實時使用情況
#指定重新整理時間間隔
$top-d1
#檢視指定程序的動態資訊
$top-p10126
$top-p10126,1
#檢視指定使用者的程序
$top-uapache
#將兩次重新整理寫入檔案中
$top-d1-b-n2>top.txt
在使用命令的時候, 直接在終端輸入下面字元有奇效,臨時發現佔用問題很管用
h|?幫助
M按記憶體的使用排序
P按CPU使用排序
N以PID的大小排序
R對排序進行反轉
f自定義顯示欄位
1 顯示所有 CPU 的負載
>向後
z彩色
W儲存top環境設定~/.toprc
當然,這個命令臨時檢視某臺機器的某個程序是Ok的,但是無法檢視趨勢,也沒辦法批量檢視多臺伺服器,我推薦使用今天發文的10個開源監控元件把伺服器監控起來。
題目四:怎麼讓程序在後臺執行?怎麼讓後臺執行的程序切換到前臺?
這一題講的是作業控制 job
,我們可以通過他靈活的讓程序在前後臺切換、暫停.
我在此處用 sleep
命令來舉例, sleep
的作用就是執行一個程序,然後等到一段時間,在這裡用來測試程序前後臺切換再合適不過。
要了解作業控制之前,先要知道前後臺是什麼概念,前臺執行一個程序,會等待互動,會卡住命令列終端,除非你使用 ctrl+c
終止,或者 ctrl+z
暫停
$sleep5
#滑鼠在此閃爍,5秒之內啥也幹不了
#用ctrl+c以後會終止程序,列印一個^C
$sleep5
^C
#用ctrl+z以後會暫停程序
$sleep5
^Z
[1]+Stoppedsleep5
暫停的程序上第一題的命令檢視狀態,狀態是 T
,如果忘了是啥意思滑上去看看。
$ps-aux|grepsleep
root291960.00.0107952356pts/0T21:450:00sleep5
用 jobs
命令也可以看到後臺程序情況,暫停也算是切換到後臺運行了,下面的輸出是一個
$jobs
[1]+Stoppedsleep5
可以看到 [1]
,代表他的標號是1, 嘗試把他排程到前臺執行,會卡那直到執行完
$fg%1
sleep5
怎麼建立一個程序讓他直接在後臺執行?只需要在結尾用一個 &
符號
$sleep100&
[1]29932
$jobs
[1]+Runningsleep100&
要暫停後臺執行的程序得先調到前臺,再用 ctrl+z
$fg%1
sleep100
^Z
[1]+Stoppedsleep100
$jobs
[1]+Stoppedsleep100
讓暫停的程序直接切換到後臺執行
$bg%1
[1]+sleep100&
$jobs
[1]+Runningsleep100&
注意: 我以前在用 curl
命令的時候會忘記給 url
加引號,如果是一個GET請求,有引數的話,一般是下面這種形式,引數分隔符會被誤認為是後臺程序執行符號!
http://127.0.0.1/query?name=coding3min&passwd=abc
最後程序管理中,怎麼幹掉一個程序就不必說了吧~,可以傳送訊號,也可以直接幹掉,最好是通過守護程序幹掉他。
拓展知識點:守護程序
最不想遇到的事就是程序掛掉,一個告警電話打過來,半夜兩三點爬起來就為了手動啟動一個程序。所以程序自動拉起是很重要的。
一般用用 systemctl
、 supervisorctl
或者自己寫個 crontab
定時任務、上 k8s
也可以,簡單點的 docker-compose
也可以。
k8s
不僅支援程序自動拉起,還可以維護多副本,配置好一定數量的副本,掛掉一個會自動恢復,甚至裡面的 HPA
支援負載均衡,可以根據你的程序佔用情況自動增減副本數量。
進行守護如果想耍流氓,怎麼殺也殺不掉,那就做成程序互相拉起,寫到程式碼裡,比如 360-A
程序掛了, 360-B
程序拉起來, 360-B
掛了 360-A
拉起來(對,我就是在黑360)
下次主題:管道與重定向
題目一:>
和 >>
有什麼區別?題目二:重定向怎麼把錯誤輸出和正確輸出分離開?題目三:怎麼快速把一個非常大的文字檔案清理掉?題目四:使用管道完成,組合 ps
、 grep
、 awk
、 xargs
、 kill
命令為一行命令,幹掉名為 apache
的程序
下次的問題非常的簡單,有時間就做做,如果我發現下次分析的時候內容太少了,我就把下下次的多寫一點。