進(jìn)程管理-Linux每日一練(6)
題目一:進(jìn)程有哪幾種狀態(tài)(生命周期)?
平時(shí)學(xué)的是這五種狀態(tài)新建、就緒、運(yùn)行、阻塞、終止,但是在Linux里面可以查看到的要更加詳細(xì),如下命令的 STAT 列就是展示了狀態(tài)
$?ps?-aux?
USER???????????????PID??%CPU?%MEM??????VSZ????RSS???TT??STAT?STARTED??????TIME?COMMAND
root???????????????981???7.3??0.0??4724748???2764???????S????五02下午??73:31.27?hexo
root?????????????79519???0.0??0.0??4277540????728?s007??S+????9:18下午???0:00.00?xxx
有很多狀態(tài),就看首字母,其他不用在意太多
R 運(yùn)行 S 可中斷睡眠 Sleep D 不可中斷睡眠 (usually IO) T 停止的進(jìn)程 Z 僵尸進(jìn)程 X 死掉的進(jìn)程
題目二:通過(guò) ps 命令我們可以獲取哪些關(guān)鍵信息?
ps 命令一般是用來(lái)查 pid 的,我們就可以通過(guò) kill 的方式干掉進(jìn)程,或者通過(guò) pid 去讀取 /proc 目錄獲取進(jìn)程監(jiān)控信息。
和 top 命令一樣,使用 ps -aux 參數(shù),可以看到進(jìn)程的各種指標(biāo)
USER: 運(yùn)行進(jìn)程的用戶 PID: 進(jìn)程 ID %CPU: CPU 占用率 %MEM: 內(nèi)存占用率 VSZ: 占用虛擬內(nèi)存 RSS: 占用實(shí)際內(nèi)存 駐留內(nèi)存 TTY: 進(jìn)程運(yùn)行的終端 STAT: 進(jìn)程狀態(tài) man ps (/STATE) STARTED: 啟動(dòng)日期 TIME: 運(yùn)行時(shí)間 COMMAND: 啟動(dòng)命令
當(dāng)然,如果只是想查看下pid,可以直接 pgrep 進(jìn)程名
$?pgrep?sshd?
10180
題目三:top 命令怎么根據(jù) cpu 、 mem 排序?通過(guò)此命令我們還能獲取哪些關(guān)鍵信息?
使用 uptime 可以查看機(jī)器負(fù)載情況
$?uptime
21:31??up?4?days,??6:54,?3?users,?load?averages:?3.54?3.27?3.02
使用 top 可以臨時(shí)查看進(jìn)程的實(shí)時(shí)使用情況

#?指定刷新時(shí)間間隔
$?top?-d?1
#?查看指定進(jìn)程的動(dòng)態(tài)信息
$?top?-p?10126?
$?top?-p?10126,1?
#?查看指定用戶的進(jìn)程
$?top?-u?apache?
#?將兩次刷新寫入文件中
$?top?-d?1?-b?-n?2?>?top.txt
在使用命令的時(shí)候, 直接在終端輸入下面字符有奇效,臨時(shí)發(fā)現(xiàn)占用問(wèn)題很管用
h|??幫助
M?按內(nèi)存的使用排序
P?按?CPU?使用排序
N?以?PID?的大小排序
R?對(duì)排序進(jìn)行反轉(zhuǎn)
f?自定義顯示字段
1 顯示所有 CPU 的負(fù)載
>?向后
z?彩色
W?保存?top?環(huán)境設(shè)置?~/.toprc
當(dāng)然,這個(gè)命令臨時(shí)查看某臺(tái)機(jī)器的某個(gè)進(jìn)程是Ok的,但是無(wú)法查看趨勢(shì),也沒(méi)辦法批量查看多臺(tái)服務(wù)器,我推薦使用今天發(fā)文的10個(gè)開源監(jiān)控組件把服務(wù)器監(jiān)控起來(lái)。
題目四:怎么讓進(jìn)程在后臺(tái)運(yùn)行?怎么讓后臺(tái)運(yùn)行的進(jìn)程切換到前臺(tái)?
這一題講的是作業(yè)控制 job ,我們可以通過(guò)他靈活的讓進(jìn)程在前后臺(tái)切換、暫停.
我在此處用 sleep 命令來(lái)舉例, sleep 的作用就是運(yùn)行一個(gè)進(jìn)程,然后等到一段時(shí)間,在這里用來(lái)測(cè)試進(jìn)程前后臺(tái)切換再合適不過(guò)。
要了解作業(yè)控制之前,先要知道前后臺(tái)是什么概念,前臺(tái)運(yùn)行一個(gè)進(jìn)程,會(huì)等待交互,會(huì)卡住命令行終端,除非你使用 ctrl+c 終止,或者 ctrl+z 暫停
$?sleep?5
#?鼠標(biāo)在此閃爍,5秒之內(nèi)啥也干不了
#?用ctrl+c?以后會(huì)終止進(jìn)程,打印一個(gè)^C
$?sleep?5
^C
#?用ctrl+z以后會(huì)暫停進(jìn)程
$?sleep?5
^Z
[1]+??Stopped?????????????????sleep?5
暫停的進(jìn)程上第一題的命令查看狀態(tài),狀態(tài)是 T ,如果忘了是啥意思滑上去看看。
$?ps?-aux?|grep?sleep
root?????29196??0.0??0.0?107952???356?pts/0????T????21:45???0:00?sleep?5
用 jobs 命令也可以看到后臺(tái)進(jìn)程情況,暫停也算是切換到后臺(tái)運(yùn)行了,下面的輸出是一個(gè)
$?jobs
[1]+??Stopped?????????????????sleep?5
可以看到 [1] ,代表他的標(biāo)號(hào)是1, 嘗試把他調(diào)度到前臺(tái)運(yùn)行,會(huì)卡那直到運(yùn)行完
$?fg?%1
sleep?5
怎么創(chuàng)建一個(gè)進(jìn)程讓他直接在后臺(tái)運(yùn)行?只需要在結(jié)尾用一個(gè) & 符號(hào)
$?sleep?100?&
[1]?29932
$?jobs
[1]+??Running?????????????????sleep?100?&
要暫停后臺(tái)運(yùn)行的進(jìn)程得先調(diào)到前臺(tái),再用 ctrl+z
$?fg?%1
sleep?100
^Z
[1]+??Stopped?????????????????sleep?100
$?jobs
[1]+??Stopped?????????????????sleep?100
讓暫停的進(jìn)程直接切換到后臺(tái)運(yùn)行
$?bg?%1
[1]+?sleep?100?&
$?jobs
[1]+??Running?????????????????sleep?100?&
注意: 我以前在用 curl 命令的時(shí)候會(huì)忘記給 url 加引號(hào),如果是一個(gè)GET請(qǐng)求,有參數(shù)的話,一般是下面這種形式,參數(shù)分隔符會(huì)被誤認(rèn)為是后臺(tái)進(jìn)程執(zhí)行符號(hào)!
http://127.0.0.1/query?name=coding3min&passwd=abc
最后進(jìn)程管理中,怎么干掉一個(gè)進(jìn)程就不必說(shuō)了吧~,可以發(fā)送信號(hào),也可以直接干掉,最好是通過(guò)守護(hù)進(jìn)程干掉他。
拓展知識(shí)點(diǎn):守護(hù)進(jìn)程
最不想遇到的事就是進(jìn)程掛掉,一個(gè)告警電話打過(guò)來(lái),半夜兩三點(diǎn)爬起來(lái)就為了手動(dòng)啟動(dòng)一個(gè)進(jìn)程。所以進(jìn)程自動(dòng)拉起是很重要的。
一般用用 systemctl 、 supervisorctl 或者自己寫個(gè) crontab 定時(shí)任務(wù)、上 k8s 也可以,簡(jiǎn)單點(diǎn)的 docker-compose 也可以。
k8s 不僅支持進(jìn)程自動(dòng)拉起,還可以維護(hù)多副本,配置好一定數(shù)量的副本,掛掉一個(gè)會(huì)自動(dòng)恢復(fù),甚至里面的 HPA 支持負(fù)載均衡,可以根據(jù)你的進(jìn)程占用情況自動(dòng)增減副本數(shù)量。
進(jìn)行守護(hù)如果想耍流氓,怎么殺也殺不掉,那就做成進(jìn)程互相拉起,寫到代碼里,比如 360-A 進(jìn)程掛了, 360-B 進(jìn)程拉起來(lái), 360-B 掛了 360-A 拉起來(lái)(對(duì),我就是在黑360)
下次主題:管道與重定向
題目一:> 和 >> 有什么區(qū)別?題目二:重定向怎么把錯(cuò)誤輸出和正確輸出分離開?題目三:怎么快速把一個(gè)非常大的文本文件清理掉?題目四:使用管道完成,組合 ps 、 grep 、 awk 、 xargs 、 kill 命令為一行命令,干掉名為 apache 的進(jìn)程
下次的問(wèn)題非常的簡(jiǎn)單,有時(shí)間就做做,如果我發(fā)現(xiàn)下次分析的時(shí)候內(nèi)容太少了,我就把下下次的多寫一點(diǎn)。
