1. 程式人生 > 其它 >卡住無法檢視到所有程序_程序管理Linux每日一練(6)

卡住無法檢視到所有程序_程序管理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 命令怎麼根據 cpumem 排序?通過此命令我們還能獲取哪些關鍵資訊?

使用 uptime 可以檢視機器負載情況

$uptime
21:31up4days,6:54,3users,loadaverages:3.543.273.02

使用 top 可以臨時檢視程序的實時使用情況

b3205bd5c0ff6168895f8947c45319bd.png
#指定重新整理時間間隔
$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

最後程序管理中,怎麼幹掉一個程序就不必說了吧~,可以傳送訊號,也可以直接幹掉,最好是通過守護程序幹掉他。

拓展知識點:守護程序

最不想遇到的事就是程序掛掉,一個告警電話打過來,半夜兩三點爬起來就為了手動啟動一個程序。所以程序自動拉起是很重要的。

一般用用 systemctlsupervisorctl 或者自己寫個 crontab 定時任務、上 k8s 也可以,簡單點的 docker-compose 也可以。

k8s 不僅支援程序自動拉起,還可以維護多副本,配置好一定數量的副本,掛掉一個會自動恢復,甚至裡面的 HPA 支援負載均衡,可以根據你的程序佔用情況自動增減副本數量。

進行守護如果想耍流氓,怎麼殺也殺不掉,那就做成程序互相拉起,寫到程式碼裡,比如 360-A 程序掛了, 360-B 程序拉起來, 360-B 掛了 360-A 拉起來(對,我就是在黑360)

下次主題:管道與重定向

題目一:>>> 有什麼區別?題目二:重定向怎麼把錯誤輸出和正確輸出分離開?題目三:怎麼快速把一個非常大的文字檔案清理掉?題目四:使用管道完成,組合 psgrepawkxargskill 命令為一行命令,幹掉名為 apache 的程序

下次的問題非常的簡單,有時間就做做,如果我發現下次分析的時候內容太少了,我就把下下次的多寫一點。