如果您的應(yīng)用程序不工作,或者您希望在尋找更多信息,這 20 個(gè)命令將派上用場(chǎng)。 在這個(gè)全新的工具和多樣化的開(kāi)發(fā)環(huán)境井噴的大環(huán)境下,任何開(kāi)發(fā)者和工程師都有必要學(xué)習(xí)一些基本的系統(tǒng)管理命令。特定的命令和工具包可幫助開(kāi)發(fā)者組織、排查故障并優(yōu)化他們的應(yīng)用程序,而且當(dāng)出現(xiàn)錯(cuò)誤時(shí),也可以為運(yùn)維人員和系統(tǒng)管理員提供有價(jià)值的分類信息。 無(wú)論你是新手開(kāi)發(fā)者還是希望管理自己的應(yīng)用程序,下面 20 條基本的系統(tǒng)管理命令都可以幫助您更好地了解您的應(yīng)用程序。它們還可以幫助解決為什么應(yīng)用程序可在本地正常工作但不能在遠(yuǎn)程主機(jī)上工作這類的系統(tǒng)故障。這些命令適用于 Linux 開(kāi)發(fā)環(huán)境、容器和虛擬機(jī)。 1. curl curl 用于傳輸一個(gè) URL??梢允褂眠@條命令用于測(cè)試應(yīng)用程序的端點(diǎn)或與上游服務(wù)端點(diǎn)的連接。curl 還可用于檢查你的應(yīng)用程序是否能連接到其他服務(wù),例如數(shù)據(jù)庫(kù),或檢查您的服務(wù)是否處于健康的狀態(tài)。 舉個(gè)例子,假如你的應(yīng)用程序拋出一個(gè) HTTP 500 錯(cuò)誤,表示無(wú)法訪問(wèn) MongoDB 數(shù)據(jù)庫(kù): -I 選項(xiàng)用于顯示頭信息,-s 選項(xiàng)表示使用靜默模式,不顯示錯(cuò)誤和進(jìn)度。檢查數(shù)據(jù)庫(kù)的端點(diǎn)是否正確: 那么可能是什么問(wèn)題呢? 檢查您的應(yīng)用程序是否可以訪問(wèn)數(shù)據(jù)庫(kù)以外的其他位置: 看起來(lái)這沒(méi)問(wèn)題,現(xiàn)在嘗試訪問(wèn)數(shù)據(jù)庫(kù)。您的應(yīng)用程序正在使用數(shù)據(jù)庫(kù)的主機(jī)名,因此請(qǐng)先嘗試: 這表示您的應(yīng)用程序無(wú)法解析數(shù)據(jù)庫(kù),因?yàn)閿?shù)據(jù)庫(kù)的 URL 不可用或主機(jī)(容器或VM)沒(méi)有可用于解析主機(jī)名的域名服務(wù)器。 2. python -m json.tool / jq 使用 curl 后,API 調(diào)用的輸出可讀性可能較差。有時(shí)候,你希望將生成的 JSON 數(shù)據(jù)格式化輸出以查找特定的條目。Python 有一個(gè)內(nèi)置的庫(kù)可幫助您實(shí)現(xiàn)這個(gè)需求??梢允褂?nbsp;python -m json.tool 來(lái)縮進(jìn)和組織 JSON。要使用 Python 的 JSON 模塊,需要使用管道機(jī)制,將 JSON 文件的輸出作為輸入,寫入到 python -m json.tool 命令行。 要使用 Python 庫(kù),使用 -m (module) 選項(xiàng)將輸出內(nèi)容和 Python 庫(kù)組合成管道。 對(duì)于更高級(jí)的 JSON 解析,可以安裝 jq。jq 提供了一些從 JSON 輸入中提取特定值的選項(xiàng)。要像上面的 Python 模塊一樣將 JSON 輸出格式化,只需將 jq 應(yīng)用到輸出即可。 3. ls ls 用于列出目錄中的文件,系統(tǒng)管理員和開(kāi)發(fā)者會(huì)經(jīng)常使用這個(gè)命令。在容器空間中,這條命令可以幫助確定容器鏡像中的目錄和文件。除了查找文件,ls 還可以用于檢查權(quán)限。下面的示例中,由于權(quán)限問(wèn)題,你不能運(yùn)行 myapp。當(dāng)你使用 ls -l 檢查權(quán)限時(shí),你會(huì)發(fā)現(xiàn)它的權(quán)限在 -rw-r--r-- 中沒(méi)有'x',只有讀寫的權(quán)限。 4. tail tail 顯示文件的最后一部分內(nèi)容。通常情況下,你不需要瀏覽每行日志以進(jìn)行故障排除。而是需要檢查日志中對(duì)應(yīng)用程序的最新請(qǐng)求的說(shuō)明。例如,當(dāng)你向 Apache HTTP 服務(wù)器發(fā)起請(qǐng)求時(shí),可以使用 tail 來(lái)檢查日志中發(fā)生的情況。 使用 tail -f 來(lái)跟蹤日志文件并在發(fā)起請(qǐng)求時(shí)查看它們。 -f 選項(xiàng)表示跟隨的意思,它可在日志被寫入文件時(shí)輸出它們。下面的示例具有每隔幾秒訪問(wèn)端點(diǎn)的后臺(tái)腳本,日志會(huì)記錄請(qǐng)求。除了實(shí)時(shí)跟蹤日志,還可以使用 tail 帶上 -n 選項(xiàng)來(lái)查看文件的最后 100 行。 5. cat cat 主要用于查看文件內(nèi)容和合并文件。你可能會(huì)使用 cat 來(lái)檢查依賴項(xiàng)文件的內(nèi)容,或確認(rèn)已在本地構(gòu)建的應(yīng)用程序的版本。 上面的示例檢查您的 Python Flask 應(yīng)用程序是否已將 Flask 列為依賴項(xiàng)。 6. grep grep 能使用特定模式匹配(包括正則表達(dá)式)搜索文本。如果你在另一條命令的輸出中尋找特定的模式,grep 會(huì)高亮顯示相關(guān)的行??墒褂眠@條命令來(lái)搜索日志文件以及特定的進(jìn)程等。如果想查看 Apache Tomcat 是否啟動(dòng),你可能會(huì)命令行的數(shù)量給淹沒(méi)。但講輸出的內(nèi)容和 grep 命令組合成管道,可以將表示服務(wù)器已啟動(dòng)的行獨(dú)立出來(lái)。 7. ps ps 用于查看進(jìn)程的各種狀態(tài)信息。使用該命令可確定正在運(yùn)行的應(yīng)用程序或確認(rèn)預(yù)期的進(jìn)程。例如,如果要檢查正在運(yùn)行的 Tomcat Web 服務(wù)器,可使用帶有選項(xiàng)的 ps 來(lái)獲取 Tomcat 的進(jìn)程 ID。 為了更好的易讀性,可使用 grep 和 ps 組合成管道。 8. env env 用于列出所有環(huán)境變量及為其賦值。在故障排除期間,你可能會(huì)發(fā)現(xiàn)需要檢查是否有錯(cuò)誤的環(huán)境變量來(lái)阻止應(yīng)用程序啟動(dòng)。在下面的示例中,該命令用于檢查程序主機(jī)上設(shè)置的環(huán)境變量。 請(qǐng)注意,該應(yīng)用程序正在使用 Python 3,并具有連接到 MongoDB 數(shù)據(jù)庫(kù)的環(huán)境變量。 9. top top 用于顯示系統(tǒng)中各個(gè)進(jìn)程的信息和資源占用狀況,類似于 Windows 的任務(wù)管理器。使用該命令可確定哪些進(jìn)程正在運(yùn)行,以及它們消耗了多少的內(nèi)存和 CPU。一種常見(jiàn)的情況是當(dāng)你運(yùn)行一個(gè)應(yīng)用程序時(shí),它在一分鐘后掛掉。這時(shí),你首先檢查應(yīng)用程序的返回錯(cuò)誤,發(fā)現(xiàn)是一個(gè)內(nèi)存錯(cuò)誤。 你的應(yīng)用是否真的內(nèi)存不足?要確認(rèn)這個(gè)問(wèn)題,可使用 top 來(lái)查看應(yīng)用程序消耗多少 CPU 和內(nèi)存。當(dāng)使用 top 命令后,您注意到一個(gè) Python 應(yīng)用程序使用了大部分的 CPU,其內(nèi)存使用量也迅速攀升。當(dāng)它運(yùn)行時(shí),如果進(jìn)程是你的應(yīng)用程序,則按'C'鍵來(lái)查看完整命令并進(jìn)行逆向工程。發(fā)現(xiàn)原來(lái)是你的內(nèi)存密集型應(yīng)用程序(memeater.py)。當(dāng)你的應(yīng)用程序已經(jīng)用盡內(nèi)存,系統(tǒng)會(huì)殺掉它并返回一個(gè)內(nèi)存不足(OOM)的錯(cuò)誤。 應(yīng)用程序的內(nèi)存和 CPU 使用量增加,最終因?yàn)閮?nèi)存不足而被殺掉。 通過(guò)按下'C'鍵,可以看到啟動(dòng)該應(yīng)用程序的完整命令 除了檢查應(yīng)用程序,還可以使用 top 來(lái)調(diào)試其他使用 CPU 或內(nèi)存的進(jìn)程。 10. netstat netstat 用于顯示網(wǎng)絡(luò)狀態(tài)信息。該命令可顯示正在使用的網(wǎng)絡(luò)端口及其傳入連接。但是,netstat 在 Linux 中不能開(kāi)箱即用。如果需要安裝它,需要在 net-tools 包中找到它。作為在本地進(jìn)行試驗(yàn)或?qū)?yīng)用程序推送到主機(jī)的開(kāi)發(fā)者,可能會(huì)收到端口已被分配或地址已被使用的錯(cuò)誤。使用 netstat 得到協(xié)議、進(jìn)程和端口這些信息,下圖表明 Apache HTTP 服務(wù)器已經(jīng)在下面的主機(jī)上使用了 80 端口。 使用 netstat -tulpn 表明 Apache 已經(jīng)在這臺(tái)機(jī)器上使用了 80 端口。 11. ip address 如果 ip address 在你的主機(jī)上不能使用,必須使用 iproute2 包進(jìn)行安裝。ip address 用于顯示應(yīng)用程序的主機(jī)接口和 IP 地址??墒褂?nbsp;ip address 來(lái)驗(yàn)證你的容器或主機(jī)的 IP 地址。例如,當(dāng)你的容器連接到兩個(gè)網(wǎng)絡(luò)時(shí),ip address 可顯示哪個(gè)接口連接到了哪個(gè)網(wǎng)絡(luò)。對(duì)于簡(jiǎn)單的檢查,可以隨時(shí)使用 ip address 命令獲取主機(jī)的 IP 地址。下面的示例展示了在接口 eth0 上的 Web 層容器的 IP 地址為 172.17.0.2 使用 ip address 顯示 eth0 接口的 IP 地址為 172.17.0.2 12. lsof lsof 用于列出當(dāng)前系統(tǒng)打開(kāi)的文件(list open files)。在某些 Linux 系統(tǒng)中,可能需要使用 lsof 包來(lái)安裝lsof。在 Linux 中,幾乎任何和系統(tǒng)的交互都被視為一個(gè)文件。因此,如果你的應(yīng)用程序?qū)懭胛募虼_(kāi)網(wǎng)絡(luò)連接,lsof 將會(huì)把這個(gè)交互映射為一個(gè)文件。與 netstat 類似,可使用 lsof 來(lái)檢查偵聽(tīng)端口。例如,如果要檢查 80 端口是否正在被使用,可使用 lsof 來(lái)檢查哪個(gè)進(jìn)程正在使用它。下面的示例中,可以看到 httpd (Apache) 在 80 端口上偵聽(tīng)。還可以使用 lsof 來(lái)檢查 httpd 的進(jìn)程ID,檢查 Web 服務(wù)器的二進(jìn)制文件所在位置(/usr/sbin/httpd)。 Lsof 表明了 httpd 在 80 端口上偵聽(tīng)。檢查 httpd 的進(jìn)程ID還可以顯示所有需要運(yùn)行的文件httpd。 打開(kāi)文件列表中的打開(kāi)文件的名稱有助于確定進(jìn)程的來(lái)源,特別是 Apache。 13. df 可以使用 df 顯示空閑的磁盤空間(display free disk space)以排查磁盤空間問(wèn)題。擋在容器管理器上運(yùn)行應(yīng)用程序時(shí),可能會(huì)收到一條錯(cuò)誤信息,提示容器主機(jī)上缺少可用空間。雖然磁盤空間應(yīng)該由系統(tǒng)管理程序來(lái)管理和優(yōu)化,你仍可以使用 df 找出目錄中的現(xiàn)有空間并確認(rèn)是否沒(méi)有空間。 Df 顯示每個(gè)文件系統(tǒng)的磁盤空間、絕對(duì)空間以及其可用性。 -h 選項(xiàng)表示以可讀性較高的方式來(lái)顯示信息,上面的例子表示這個(gè)主機(jī)具有大量的磁盤空間。 14. du du 命令也是用于查看使用空間的,但是與 df 命令不同的是 du 命令是對(duì)文件和目錄磁盤使用的空間的查看,要獲取有關(guān)哪些文件在目錄中使用磁盤空間的更多詳細(xì)信息,可以使用 du 命令,和 df 命令還是有一些區(qū)別的。例如,你想了解那個(gè)日志文件占用 /var/log 目錄最多的空間,可以使用 du 命令加上 -h 選項(xiàng)和用于獲取總大小的 -s 選項(xiàng)。 上面的示例中顯示了 /var/log 下的的最大目錄為 /var/log/audit??梢詫?nbsp;du 和 df 搭配使用,以確定在應(yīng)用程序的主機(jī)上使用的磁盤空間。 15. id 要檢查運(yùn)行應(yīng)用程序的用戶,可使用 id 命令來(lái)返回用戶身份。id 命令可以顯示真實(shí)有效的用戶ID(UID)和組ID(GID)。下面的示例使用 Vagrant 來(lái)測(cè)試應(yīng)用程序并隔離其開(kāi)發(fā)環(huán)境。登錄進(jìn) Vagrant 盒子后,如果嘗試安裝 Apache HTTP Server(依賴關(guān)系),系統(tǒng)會(huì)提示你需要以 root 身份執(zhí)行該命令。要檢查你的用戶ID和組ID,使用 id 命令,會(huì)發(fā)現(xiàn)你正在'vagrant'組中以'vagrant'用戶身份運(yùn)行。 要解決此問(wèn)題,必須以超級(jí)用戶的身份運(yùn)行該命令,這將提供提升的權(quán)限。 16. chmod chmod 命令用來(lái)變更文件或目錄的權(quán)限。當(dāng)你在主機(jī)上首次運(yùn)行應(yīng)用程序的二進(jìn)制文件時(shí),可能會(huì)收到錯(cuò)誤提示信息“拒絕訪問(wèn)”。如 ls 的示例所示,可以用于檢查應(yīng)用程序二進(jìn)制文件的權(quán)限。 這表明您沒(méi)有權(quán)限(沒(méi)有“x”)來(lái)運(yùn)行二進(jìn)制文件。chmod 可以修改權(quán)限,使的用戶能夠運(yùn)行二進(jìn)制文件。 如例子所示,這將更新權(quán)限,使其具有可執(zhí)行的權(quán)限?,F(xiàn)在當(dāng)你嘗試執(zhí)行二進(jìn)制文件時(shí),應(yīng)用程序不會(huì)拋出拒絕訪問(wèn)的錯(cuò)誤。當(dāng)將二進(jìn)制文件加載到容器時(shí),Chmod 可能很有用。它能保證容器具有合適的權(quán)限以執(zhí)行二進(jìn)制文件。 17. dig / nslookup dig 命令是常用的域名查詢工具,可以用來(lái)測(cè)試域名系統(tǒng)工作是否正常。域名服務(wù)器(DNS)有助于將 URL 解析為一組應(yīng)用程序服務(wù)器。然而,你會(huì)發(fā)現(xiàn)有些 URL 不能被解析,這會(huì)導(dǎo)致應(yīng)用程序的連接問(wèn)題。例如,假如你嘗試從應(yīng)用程序的主機(jī)訪問(wèn)你的數(shù)據(jù)庫(kù)。你收到一個(gè)'不能解析'的錯(cuò)誤。要進(jìn)行故障排查,你嘗試使用 dig(DNS 查詢工具)或 nslookup(查詢 Internet 域名服務(wù)器)來(lái)確定應(yīng)用程序似乎無(wú)法解析數(shù)據(jù)的原因。 使用 nslookup 顯示無(wú)法解析 mydatabase。嘗試使用 dig 解決,但仍是相同的結(jié)果。 這些錯(cuò)誤可能是由許多不同的問(wèn)題引起的。如果無(wú)法調(diào)試出根本原因,與系統(tǒng)管理員聯(lián)系以進(jìn)行更多的調(diào)查。對(duì)于本地測(cè)試,這些問(wèn)題可能表示你的主機(jī)的域名服務(wù)器未正確配置。要使用這些命令,需要安裝 BIND Utilities 包。 18. iptables iptables 用于阻止或允許 Linux 主機(jī)上的流量,用于 IP 包過(guò)濾器管理,類似于網(wǎng)絡(luò)防火墻。此工具可阻止某些應(yīng)用程序接收或發(fā)送請(qǐng)求。更具體地說(shuō),如果您的應(yīng)用程序難以訪問(wèn)另一個(gè)端點(diǎn),可能已被 iptables 拒絕流量訪問(wèn)該端點(diǎn)。例如,假設(shè)您的應(yīng)用程序的主機(jī)無(wú)法訪問(wèn) Opensource.com,您使用 curl 來(lái)測(cè)試連接。 連接超時(shí)。您懷疑某些東西可能會(huì)阻塞流量,因此您使用 -S 選項(xiàng)顯示 iptables 規(guī)則。 前三個(gè)規(guī)則顯示,默認(rèn)情況下流量已被丟棄。剩下的規(guī)則表示允許 SSH 和 DNS 流量。在這種情況下,如果需要允許流量到外部端點(diǎn)的規(guī)則,請(qǐng)跟上 sysadmin。如果這是用于本地開(kāi)發(fā)或測(cè)試的主機(jī),可使用 iptables 命令來(lái)允許合適的流量。添加允許到主機(jī)的流量的規(guī)則時(shí)一定要謹(jǐn)慎。 19. sestatus 通常會(huì)在企業(yè)管理的應(yīng)用程序主機(jī)上使用 SELinux(一個(gè) Linux 安全模塊)。SELinux 對(duì)主機(jī)上運(yùn)行的進(jìn)程提供最低權(quán)限的訪問(wèn),防止?jié)撛诘膼阂膺M(jìn)程訪問(wèn)系統(tǒng)上的重要文件。某些情況下,應(yīng)用程序需要訪問(wèn)特定文件,但可能會(huì)發(fā)生錯(cuò)誤。要檢查 SELinux 是否阻止了應(yīng)用程序,使用 tail 和 grep 在 /var/log/audit 日志記錄中查找'denied'(被拒絕)的信息。否則,使用 sestatus 來(lái)檢查是否啟動(dòng)了 SELinux。 上面的輸出表示應(yīng)用程序的主機(jī)已啟用 SELinux。在本地開(kāi)發(fā)環(huán)境中,可以更新 SELinux 使得權(quán)限更寬松。 20. history 當(dāng)你使用大量的命令進(jìn)行測(cè)試和調(diào)試時(shí),可能會(huì)忘記有用的命令。每個(gè) shell 都有一個(gè) history 命令的變體。它可顯示自會(huì)話開(kāi)始以來(lái)使用的命令的歷史記錄??梢允褂?nbsp;history 來(lái)記錄用來(lái)排除應(yīng)用程序故障的命令。history 命令用于顯示指定數(shù)目的指令命令,讀取歷史命令文件中的目錄到歷史命令緩沖區(qū)和將歷史命令緩沖區(qū)中的目錄寫入命令文件。 如果希望執(zhí)行之前歷史記錄中的命令,但又不想重新輸入,該怎么辦?使用符號(hào) ! 即可,可以使用符號(hào) ! 執(zhí)行指定序號(hào)的歷史命令。例如,要執(zhí)行第 2 個(gè)歷史命令,則輸入!2, 在需要重新執(zhí)行的命令的指定編號(hào)前添加 ! 即可重新執(zhí)行 這些基本命令能增強(qiáng)排查故障的專業(yè)技能,可檢查為什么應(yīng)用程序可以在一個(gè)開(kāi)發(fā)環(huán)境中工作,而在另一個(gè)開(kāi)發(fā)環(huán)境中則不可以。許多系統(tǒng)管理員使用這些命令來(lái)調(diào)試系統(tǒng)問(wèn)題。了解一些有用的故障排查命令可幫助解決應(yīng)用程序的問(wèn)題。 編譯自:https:// 更多干貨請(qǐng)前往公眾號(hào)菜單欄“讀我”->“干貨分享”查看。 |
|