系統管理員都應該知道的20個Linux命令(上)
在一個充斥著新工具和多樣化開發環境的世界中,幾乎所有開發人員或工程師都有必要學習一些基本的系統管理命令。特定的命令和軟件包可以幫助開發人員組織、排除故障并優化其應用程序,并且在出現問題時為操作員和系統管理員提供有價值的分類信息。
無論你是新開發人員還是希望管理自己的應用程序,以下20個基本的sysadmin命令都可以幫助你更好地理解應用程序。它們還可以幫助你向系統管理員描述問題,并排除應用程序可能在本地工作而不在遠程主機上工作的原因。這些命令適用于Linux開發環境、容器、虛擬機(VM)和裸機。
1. curl
curl調用一個URL。使用此命令測試應用程序的端點或與上游服務端點的連接。curl對于確定應用程序是否可以訪問其他服務(如數據庫)或檢查服務是否正常非常有用。
例如,假設您的應用程序拋出HTTP 500錯誤,指示它無法訪問MongoDB數據庫:
$ curl -I -s myapplication:5000 HTTP/1.0 500 INTERNAL SERVER ERROR
-I 選項顯示頁面頭信息(header),-s選項不顯示頁面body信息。從本地桌面檢查數據庫的終結點:
$ curl -I -s database:27017 HTTP/1.0 200 OK
那么問題出在哪里呢?檢查應用程序是否可以從應用程序主機訪問數據庫以外的其他位置:
$ curl -I -s https://opensource.com HTTP/1.1 200 OK
看起來沒問題。現在嘗試從應用程序主機訪問數據庫。你的應用程序正在使用數據庫的主機名,請首先嘗試:
$ curl database:27017 curl: (6) Couldn't resolve host 'database'
這表示應用程序無法解析數據庫,因為數據庫的URL不可用,或者主機(容器或VM)沒有可用于解析主機名的名稱服務器。
2. python -m json.tool / jq
了解了curl后,信息的輸出可能比較很難讀取。所以有時候你需要提高輸出信息的可讀性。Python有一個內置的JSON庫,可以幫助實現這一點。您可以使用 python-m json.tool 縮進和組織json。要使用Python的JSON模塊,將JSON文件的輸出通過管道傳輸到python -m json.tool命令中。
$ cat test.json
{"title":"Person","type":"object","properties":{"firstName":{"type":"string"},"lastName":{"type":"string"},"age":{"description":"Age in years","type":"integer","minimum":0}},"required":["firstName","lastName"]}
要使用Python庫,請使用-m(module)選項將輸出通過管道傳輸到Python:
$ cat test.json | python -m json.tool
{
"properties": {
"age": {
"description": "Age in years",
"minimum": 0,
"type": "integer"
},
"firstName": {
"type": "string"
},
"lastName": {
"type": "string"
}
},
"required": [
"firstName",
"lastName"
],
"title": "Person",
"type": "object"
}
對于更高級的JSON解析,您可以安裝jq。jq提供了一些從JSON輸入中提取特定值的選項。要像上面的Python模塊一樣漂亮地打印,只需將jq應用于輸出。
$ cat test.json | jq
{
"title": "Person",
"type": "object",
"properties": {
"firstName": {
"type": "string"
},
"lastName": {
"type": "string"
},
"age": {
"description": "Age in years",
"type": "integer",
"minimum": 0
}
},
"required": [
"firstName",
"lastName"
]
}
3. ls
ls列出目錄中的文件。系統管理員和開發人員經常發出此命令。在容器空間中,此命令可以幫助確定容器映像的目錄和文件。除了查找文件外,ls還可以幫助您檢查權限。在下面的示例中,由于權限問題,您無法運行myapp。當您使用ls-l檢查權限時,您會發現這些權限在-rw-r--r--中沒有“x”,它們是只讀和寫的。
$ ./myapp bash: ./myapp: Permission denied $ ls -l myapp -rw-r--r--. 1 root root 33 Jul 21 18:36 myapp
4. tail
tail顯示文件的最后一部分。你通常不需要每個日志行來進行故障排除。相反,您希望檢查日志中關于應用程序最近請求的內容。例如,當您向Apache HTTP服務器發出請求時,你可以使用tail檢查日志中發生了什么。
$ tail -f /var/log/httpd/access.log

-f 選項表示“follow”,該選項在日志行寫入文件時輸出日志行。該示例有一個后臺腳本,每隔幾秒鐘訪問一次端點,日志記錄請求。您也可以使用tail來查看文件的最后100行(使用-n選項),而不是實時跟蹤日志。
$ tail -n 100 /var/log/httpd/access_log
5. cat
cat連接并打印文件。您可以發出cat來檢查依賴項文件的內容,或者確認您已經在本地構建的應用程序的版本。
$ cat requirements.txt flask flask_pymongo
上面的示例檢查Python Flask應用程序是否將Flask列為依賴項。
6. grep
grep搜索文件模式。如果要在另一個命令的輸出中查找特定模式,grep將高亮顯示相關行。使用此命令搜索日志文件、特定進程等。如果您想查看ApacheTomcat是否啟動,那么您可能會被大量的行所淹沒。通過將輸出管道化到grep命令,可以隔離指示服務器啟動的行。
$ cat tomcat.log | grep org.apache.catalina.startup.Catalina.start 01-Jul-2017 18:03:47.542 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in 681 ms
7. ps
ps命令是procps-ng包的一部分,它提供用于調查進程ID的有用命令,顯示正在運行的進程的狀態。使用此命令確定正在運行的應用程序或確認預期進程。例如,如果要檢查正在運行的Tomcat web服務器,可以使用ps及其選項來獲取Tomcat的進程ID。
$ ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 2 18:55 ? 00:00:02 /docker-java-home/jre/bi root 59 0 0 18:55 pts/0 00:00:00 /bin/sh root 75 59 0 18:57 pts/0 00:00:00 ps -ef 為了更清晰,可以結合管道使用grep: $ ps -ef | grep tomcat root 1 0 1 18:55 ? 00:00:02 /docker-java-home/jre/bi
8. env
env允許您設置或打印環境變量。在故障排除過程中,您可能會發現它有助于檢查錯誤的環境變量是否會阻止應用程序啟動。在下面的示例中,此命令用于檢查應用程序主機上設置的環境變量。
$ env PYTHON_PIP_VERSION=9.0.1 HOME=/root DB_NAME=test PATH=/usr/local/bin:/usr/local/sbin LANG=C.UTF-8 PYTHON_VERSION=3.4.6 PWD=/ DB_URI=mongodb://database:27017/test
請注意,應用程序正在使用Python,并且具有連接到MongoDB數據庫的環境變量。
9. top
top顯示并更新已排序的進程信息。使用此監視工具可以確定哪些進程正在運行,以及它們消耗了多少內存和CPU。當你運行一個應用程序并在一分鐘后消亡時,會出現一種常見情況。首先,檢查應用程序的返回錯誤,這是一個內存錯誤:
$ tail myapp.log Traceback (most recent call last): MemoryError
真的是應用程序內存不足嗎?要確認,請使用top來確定應用程序消耗的CPU和內存量。在發布top時,您注意到一個Python應用程序使用了大部分CPU,內存使用率不斷攀升,并懷疑它就是您的應用程序。當它運行時,點擊“C”鍵可以看到完整的命令,如果進程是您的應用程序,則可以進行反向工程。它原來是內存密集型應用程序(memeater.py)。當您的應用程序內存不足時,系統將以內存不足(OOM)錯誤終止它。

應用程序的內存和CPU使用率增加,最終被殺死

通過點擊“C”鍵,您可以看到啟動應用程序的完整命令
除了檢查您自己的應用程序外,您還可以使用top調試其他使用CPU或內存的進程。
10. netstat
netstat顯示網絡狀態。此命令顯示正在使用的網絡端口及其傳入連接。然而,netstat在Linux上并不是現成的。如果需要安裝它,可以在net-tools包中找到它。作為在本地進行實驗或將應用程序推送到主機的開發人員,您可能會收到一個錯誤,即端口已分配或地址已在使用。將netstat與協議、進程和端口選項一起使用表明,Apache HTTP服務器已經在下面的主機上使用了端口80。

使用netstat-tulpn表明Apache已經在這臺機器上占用了端口80
本文作者:Rosemary Wang,翻譯:GLIU
原文來自:www.opensource.com