到部署的實戰(zhàn)指南)
1. 為什么Python程序員繞不開Linux先聊個真實的場景。我見過不少Python開發(fā)者在Windows上寫代碼寫得飛起一到部署就抓瞎。本地跑得好好的Django項目傳到服務(wù)器上不是缺依賴就是路徑不對折騰一晚上還是沒跑起來。說句不客氣的話問題多半出在你不熟悉Linux。Python這門語言有一個特點——它的生態(tài)和Linux深度綁定。從包管理到進程管理從日志查看到定時任務(wù)生產(chǎn)環(huán)境里幾乎清一色是Linux。哪怕你用的是Docker底層跑的也是Linux內(nèi)核。你本地用的Windows只是開發(fā)環(huán)境真正的戰(zhàn)場在Linux上。所以很多團隊招Python后端工程師的時候都會帶上一條熟悉Linux常用命令。這不是門檻是基本功。說白了Linux命令對你的意義不是會不會敲而是能不能在遇到問題的時候第一時間找到關(guān)鍵線索。這篇文章不是讓你背命令手冊而是從一個Python開發(fā)者的實際角度把日常開發(fā)、調(diào)試、部署、排錯過程中真正用得上的命令和思路梳理一遍。文中的命令我都按什么場景下用、為什么這么用、有沒有坑來寫照著敲就能用。2. 環(huán)境隔離虛擬環(huán)境與Python版本管理2.1 venvPython項目的第一道隔離墻Python項目最頭疼的問題之一就是依賴沖突。項目A要用Django 3.2項目B要升到Django 5.0如果你只有一個全局Python環(huán)境早晚要出事。虛擬環(huán)境就是干這個的。創(chuàng)建虛擬環(huán)境的標(biāo)準(zhǔn)姿勢# 進入你的項目目錄 cd ~/projects/myblog # 創(chuàng)建虛擬環(huán)境名字叫 venv也有人用 .venv看團隊習(xí)慣 python3 -m venv venv # 激活虛擬環(huán)境 source venv/bin/activate激活之后你會注意到命令行前面多了個(venv)前綴這就說明當(dāng)前shell環(huán)境已經(jīng)切換到這個項目專屬的Python環(huán)境里了。之后再敲pip install裝的包只會出現(xiàn)在這個虛擬環(huán)境里不會污染全局。退出虛擬環(huán)境用deactivate有一個細(xì)節(jié)很多新手會忽略激活虛擬環(huán)境之后命令行里的python和pip指的都是venv/bin/下的軟鏈接不再是系統(tǒng)的/usr/bin/python3。你可以用which python查看路徑確認(rèn)一下which python # 輸出類似~/projects/myblog/venv/bin/python2.2 用requirements.txt鎖定依賴虛擬環(huán)境搭配requirements.txt是Python項目的標(biāo)配。生成依賴清單# 導(dǎo)出當(dāng)前環(huán)境的所有依賴及精確版本號 pip freeze requirements.txt在另一臺機器上還原環(huán)境pip install -r requirements.txt實際工作中我強烈建議你區(qū)別對待requirements.txt和requirements-dev.txt。前者只放生產(chǎn)環(huán)境需要的依賴Django、gunicorn、redis這些后者額外放開發(fā)工具pytest、black、flake8。否則部署的時候會裝一堆沒用的包浪費時間和磁盤空間。2.3 pyenv管理多個Python版本有時候你手上不止一個項目有的用Python 3.8有的用Python 3.12。光靠系統(tǒng)自帶的Python版本是沒法滿足的。這時候用pyenv。安裝pyenv的步驟這里不展開裝好之后核心命令很好記# 查看可安裝的Python版本 pyenv install --list # 安裝指定版本 pyenv install 3.10.14 # 設(shè)置當(dāng)前目錄使用的Python版本會在目錄下生成 .python-version 文件 pyenv local 3.10.14 # 查看當(dāng)前使用的版本 pyenv versionspyenv的原理不復(fù)雜它把不同版本的Python編譯后裝到~/.pyenv/versions/目錄下再通過PATH環(huán)境變量的順序切換讓當(dāng)前shell優(yōu)先使用指定版本的Python。相當(dāng)于給用哪個Python解釋器加了一層代理。我自己的習(xí)慣是系統(tǒng)Python永遠(yuǎn)不動全局用pyenv指定一個穩(wěn)定版本每個項目再用venv隔離依賴三層互不干擾。這套組合拳在本地開發(fā)和服務(wù)器部署上都適用。3. 日志、文件和文本處理Python程序員的日常操作3.1 查看日志的姿勢比你想的重要程序跑起來之后第一件事就是看日志。日志就是程序的體檢報告哪行代碼出了什么問題、請求耗時多少、有沒有報錯都在里面。最基礎(chǔ)的查看命令# 查看日志文件完整內(nèi)容 cat app.log # 分頁查看適合大文件 less app.log # 只看最后200行部署后最常用 tail -n 200 app.log # 實時跟蹤日志輸出CtrlC退出 tail -f app.log部署場景里我90%的時候都在用tail -f。比如你用gunicorn跑Django服務(wù)啟動之后窗口上刷的日志就是標(biāo)準(zhǔn)輸出但如果你用nohup或systemd把服務(wù)放后臺跑日志就落到了文件里。這時候tail -f就能實時看到請求進來了、有沒有報500。3.2 日志檢索grep才是主角日志文件幾十MB甚至上百MB的時候用cat或less翻頁完全沒有效率。正確做法是用grep檢索關(guān)鍵字# 查找所有包含 Traceback 的行 grep Traceback app.log # 查找ERROR級別的日志并顯示行號 grep -n ERROR app.log # 不區(qū)分大小寫且顯示匹配行的前后各5行 grep -i -n -C 5 timeout app.log-C 5這個參數(shù)特別有用。報錯信息往往不在一行里比如Python的異常堆棧Traceback (most recent call last)在頂部真正的原因可能隔了十幾行。用-C把上下文帶出來才能看清前因后果。如果你要在大量日志里統(tǒng)計某個關(guān)鍵字出現(xiàn)的次數(shù)grep -c ERROR app.log # 或者忽略大小寫 grep -ci error app.log3.3 用awk和sed做輕量級數(shù)據(jù)處理Python程序員可能覺得處理文本我直接用Python不就行了當(dāng)然可以但在Linux命令行環(huán)境下awk和sed有時候更順手尤其是快速看一眼數(shù)據(jù)時沒必要為了一個小需求單獨寫腳本。awk的核心邏輯是按列處理。日志里最常見的格式是空格或逗號分隔的字段。比如一條Nginx日志127.0.0.1 - - [10/Oct/2024:13:55:36 0800] GET /api/users HTTP/1.1 200 1024我想只看IP、請求路徑和狀態(tài)碼awk {print $1, $7, $9} access.logawk默認(rèn)按空格切分$1是IP$7是請求路徑$9是狀態(tài)碼。就這么簡單。sed的核心邏輯是按行替換最常用的場景是批量替換配置或數(shù)據(jù)里的內(nèi)容# 把 import 后面的 requests 改成 httpx忽略大小寫 sed -i s/requests/httpx/g requirements.txt # 只打印第10到20行 sed -n 10,20p app.log3.4 查找文件find和locate項目文件越堆越多經(jīng)常忘了某個配置文件放哪了。這時候# 在當(dāng)前目錄下遞歸查找所有 .py 文件 find . -name *.py # 按文件名查找并排除venv目錄 find . -name settings.py -not -path ./venv/* # 查找最近10分鐘內(nèi)修改過的文件 find . -mmin -10 # 按文件大小查找大于50MB的文件 find . -size 50Mfind和grep還經(jīng)常組合在一起用比如查找所有包含requests的Python文件grep -rl requests --include*.py .-r是遞歸-l是只列出文件名。另外locate命令用數(shù)據(jù)庫索引查文件名速度比find快一個數(shù)量級。缺點是索引不是實時的新文件可能查不到需要先執(zhí)行updatedb更新索引。3.5 磁盤和文件大小排查日志文件過多會把磁盤塞滿這是服務(wù)器上最常見的故障之一。排查思路# 查看磁盤整體使用情況 df -h # 查看當(dāng)前目錄下各個子目錄和文件的占用大小 du -sh * # 按大小排序找到最大的目錄 du -sh * | sort -rh | head -n 10df -h看的是掛載點的空間du -sh *看的是實際文件占用。組合使用能快速定位磁盤滿的元兇。我遇到過幾次生產(chǎn)事故最后都是查du -sh *發(fā)現(xiàn)是日志文件沒做輪轉(zhuǎn)一直長到幾十GB。4. Python項目部署里的關(guān)鍵環(huán)節(jié)4.1 用systemd管理Python服務(wù)開發(fā)環(huán)境下你可能習(xí)慣python manage.py runserver但生產(chǎn)環(huán)境這么跑等于裸奔——終端一關(guān)服務(wù)就沒了。正確的做法是把服務(wù)交給systemd管理開機自啟、崩潰自動重啟、日志統(tǒng)一收集。先創(chuàng)建一個service文件sudo vim /etc/systemd/system/myblog.service內(nèi)容大致長這樣[Unit] DescriptionMy Django Blog Afternetwork.target [Service] Userdeploy Groupdeploy WorkingDirectory/home/deploy/projects/myblog ExecStart/home/deploy/projects/myblog/venv/bin/gunicorn config.wsgi:application -b 127.0.0.1:8000 --workers 3 Restartalways RestartSec3 [Install] WantedBymulti-user.target注意ExecStart里我寫的是venv/bin/gunicorn而不是全局的gunicorn。這一步非常關(guān)鍵因為在venv里安裝的gunicorn只有venv自己知道不寫絕對路徑的話systemd是在系統(tǒng)環(huán)境里找命令大概率會報404找不到。寫完配置之后的操作# 重新加載systemd配置 sudo systemctl daemon-reload # 啟動服務(wù) sudo systemctl start myblog # 設(shè)置開機自啟 sudo systemctl enable myblog # 查看服務(wù)狀態(tài) sudo systemctl status myblog # 實時查看服務(wù)日志 sudo journalctl -u myblog -fjournalctl這個命令建議你刻意多用幾次它會把你服務(wù)的標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯誤統(tǒng)一收集起來。以后排查問題的時候不需要登錄到服務(wù)器上一個文件一個文件找直接一條命令全看。4.2 后臺運行與持久化日志有些臨時腳本不想用systemd托管比如一個跑數(shù)據(jù)采集的任務(wù)你想讓它安安靜靜在后臺跑關(guān)掉終端也不中斷。這時候用nohupnohup python3 spider.py spider.log 21 拆開看是什么意思nohup忽略掛斷信號終端關(guān)閉進程不退出把標(biāo)準(zhǔn)輸出寫到 spider.log21把標(biāo)準(zhǔn)錯誤也寫到同一個文件這步千萬別省不然報錯你看不到最后的是讓進程進入后臺之后想看任務(wù)跑得怎么樣# 查看進程是否存活 ps aux | grep spider.py # 看日志尾部 tail -f spider.log # 殺掉進程 kill PID4.3 定時任務(wù)crontab數(shù)據(jù)清洗、報表統(tǒng)計、定時備份這些重復(fù)性工作交給crontab最合適。# 編輯當(dāng)前用戶的定時任務(wù) crontab -e一行一個任務(wù)格式是分 時 日 月 周 命令。想每天凌晨2點執(zhí)行一次備份腳本0 2 * * * /home/deploy/projects/backup.sh /home/deploy/backup.log 21這里又一個常見坑cron環(huán)境下的PATH和你在終端里看到的不一樣基本是最小環(huán)境。所以腳本里盡量寫命令的絕對路徑或者干脆在腳本開頭先source ~/.bashrc。不然你會發(fā)現(xiàn)手動執(zhí)行好好的腳本進了cron就報command not found。定時任務(wù)的日志一般放在系統(tǒng)日志里# 查看當(dāng)前用戶的cron執(zhí)行日志 grep CRON /var/log/syslog4.4 端口占用與進程排查服務(wù)起不來第一反應(yīng)不是看代碼而是看端口有沒有被占。比如8000端口被別的進程占了# 查看誰占用了8000端口新版Linux用ss更方便 ss -tlnp | grep 8000 # 老一點的系統(tǒng)也可以用netstat netstat -tlnp | grep 8000-t是tcp-l是監(jiān)聽狀態(tài)-n不顯示域名直接顯示IP-p顯示進程名和PID。看到PID之后直接# 殺掉占用端口的進程 kill -9 PID查進程本身# 查看所有Python進程 ps aux | grep python # 只看進程樹理清父子關(guān)系 pstree -ppstree這個命令在排查進程怎么又多了幾個或者誰啟動了誰的時候非常直觀。比如你用gunicorn起了3個workerpstree能清晰地看到master進程下面掛著3個child進程。4.5 系統(tǒng)資源查看top和free線上服務(wù)變慢先看兩類資源CPU和內(nèi)存。# 動態(tài)查看系統(tǒng)進程資源占用按CPU排序 top # 按內(nèi)存排序 top -o %MEM # 實時刷新時按M鍵也能切換成按內(nèi)存排序內(nèi)存方面# 查看內(nèi)存使用情況 free -hfree -h里有幾個指標(biāo)要注意available才是真正可用的內(nèi)存不是free列。因為Linux會用空閑內(nèi)存做文件緩存buff/cache這部分在需要時是可以釋放的。你要是拿free列來判斷內(nèi)存夠不夠很容易誤判成內(nèi)存不足。Python項目常見的內(nèi)存問題有兩個一是進程積壓太多請求沒釋放二是某個長駐進程慢慢漲。這時候用top觀察RES列的變化看哪個進程內(nèi)存持續(xù)上漲再結(jié)合日志定位代碼位置。5. 遠(yuǎn)程連接與文件傳輸從本地開發(fā)到服務(wù)器部署5.1 SSH遠(yuǎn)程開發(fā)的地基到服務(wù)器上操作最常用的工具就是SSH。# 連接服務(wù)器 ssh deployyour_server_ip # 指定端口連接 ssh -p 2222 deployyour_server_ip # 執(zhí)行單條命令不進入交互界面 ssh deployyour_server_ip df -hSSH的認(rèn)證方式生產(chǎn)環(huán)境強烈建議用密鑰而不是密碼。生成密鑰對ssh-keygen -t rsa -b 4096生成的公鑰在~/.ssh/id_rsa.pub私鑰在~/.ssh/id_rsa。把公鑰內(nèi)容追加到服務(wù)器上~/.ssh/authorized_keys文件里之后登錄就不用輸密碼了。更省事的方式是用ssh-copy-id直接把公鑰推過去ssh-copy-id deployyour_server_ip5.2 scp與rsync文件怎么傳到服務(wù)器本地文件傳到服務(wù)器最簡單的是scp# 上傳本地文件到服務(wù)器 scp local_file.py deployyour_server_ip:/home/deploy/ # 上傳整個目錄加 -r scp -r ./myblog deployyour_server_ip:/home/deploy/ # 從服務(wù)器下載文件到本地 scp deployyour_server_ip:/home/deploy/app.log ./scp夠用但如果你經(jīng)常同步代碼目錄推薦rsync它的增量同步比scp全量復(fù)制高效得多# 同步代碼目錄到服務(wù)器排除venv和緩存文件 rsync -avz --exclude venv --exclude __pycache__ ./myblog/ deployyour_server_ip:/home/deploy/myblog/-a是歸檔模式保文件屬性-v是顯示過程-z是壓縮傳輸局域網(wǎng)或帶寬有限時效果明顯。--exclude可以忽略不需要同步的目錄比如venv、.git、pycache、.log文件。rsync 還有一點對開發(fā)者特別實用如果本地和服務(wù)器文件一模一樣它會直接跳過不會白白占帶寬。本地改了幾個文件就只傳那幾個省時省力。5.3 tmux遠(yuǎn)程會話不斷線SSH登錄到服務(wù)器干活最怕的是網(wǎng)絡(luò)一抖會話斷開正在跑的任務(wù)也沒了。tmux就是一個會話保持工具讓你的任務(wù)在遠(yuǎn)程終端關(guān)閉之后繼續(xù)跑。# 新建一個會話 tmux new -s work # 脫離會話回到普通shell任務(wù)繼續(xù)在后臺跑 Ctrlb 然后按 d # 查看所有會話 tmux ls # 重新接入之前的會話 tmux attach -t work整個流程就是SSH登錄服務(wù)器tmux new -s deploy在里面跑部署、跑腳本然后Ctrlb d斷開?;丶谊P(guān)電腦第二天登錄服務(wù)器tmux attach -t deploy任務(wù)還在那兒等你。我部署Django項目、跑數(shù)據(jù)遷移這類耗時操作幾乎都在tmux里做。哪怕服務(wù)器SSH斷了也不慌重新連上再接回去就行。5.4 快速排查網(wǎng)絡(luò)問題部署完之后服務(wù)沒起來或者訪問不了按這個順序排查# 1. 先看端口有沒有監(jiān)聽 ss -tlnp | grep 8000 # 2. 本機訪問試試 curl -I http://127.0.0.1:8000 # 3. 看對外IP和網(wǎng)關(guān) ip addr ip route # 4. 測試外網(wǎng)訪問是否通 ping -c 4 8.8.8.8curl是檢驗HTTP服務(wù)最方便的工具curl -I只看響應(yīng)頭curl -v顯示詳細(xì)交互過程。后端接口返回500還是404用curl一眼就能看出來。6. 基礎(chǔ)但高頻的命令文件操作與權(quán)限6.1 文件目錄的基本操作# 查看當(dāng)前目錄 pwd # 列出文件-l 詳細(xì)信息-a 含隱藏文件-h 人類可讀大小 ls -lah # 創(chuàng)建目錄-p 遞歸創(chuàng)建 mkdir -p data/logs # 復(fù)制文件-r 復(fù)制目錄 cp -r project_backup project_new # 移動或重命名 mv old_name.py new_name.py # 刪除文件-rf 遞歸強制刪除目錄慎用 rm -rf temp_dirrm -rf是Linux里最容易出事故的命令沒有之一。我的經(jīng)驗是刪除重要東西之前先ls確認(rèn)路徑或者在命令里用絕對路徑再核對一遍。尤其不要隨手在rm -rf后面加空格和*手一抖整個目錄就沒了。6.2 權(quán)限管理chmod和chownPython項目部署到服務(wù)器后經(jīng)常遇到權(quán)限不夠或者不能執(zhí)行的問題。權(quán)限的基礎(chǔ)知識是每個文件有三組權(quán)限分別針對所有者、所屬組、其他人。每組權(quán)限用字母或數(shù)字表示rwx對應(yīng)4、2、1。# 給腳本添加執(zhí)行權(quán)限 chmod x run.sh # 設(shè)置所有者讀、寫、執(zhí)行(7)組讀執(zhí)行(5)其他人讀執(zhí)行(5) chmod 755 run.sh # 修改文件所有者為deploy用戶 sudo chown deploy:deploy app.log一個常見的場景你從本地rsync文件到服務(wù)器所有者是root結(jié)果部署用戶是deploy程序啟動時沒權(quán)限寫日志文件報PermissionError。解決辦法就是chown把目錄歸屬改過來sudo chown -R deploy:deploy /home/deploy/myblog/6.3 環(huán)境變量讓程序能找到配置Python程序里經(jīng)常需要讀取環(huán)境變量比如數(shù)據(jù)庫密碼、SECRET_KEY。在Linux下設(shè)置環(huán)境變量# 當(dāng)前會話臨時生效 export DATABASE_URLpostgres://user:passlocalhost/dbname python3 app.py # 永久生效把export寫入 ~/.bashrc 或 ~/.profile echo export DATABASE_URLpostgres://user:passlocalhost/dbname ~/.bashrc source ~/.bashrc # 查看某個環(huán)境變量 echo $DATABASE_URL在systemd的service文件里也可以用Environment字段配置環(huán)境變量。這個比往.bashrc里寫更干凈服務(wù)級別的配置就應(yīng)該跟服務(wù)走。7. 一些能直接提升效率的命令組合7.1 alias把長命令變成快捷鍵有些命令組合你每天都在敲完全可以收進~/.bashrc里alias activatesource venv/bin/activate alias gsgit status alias gdgit diff alias glgit log --oneline --graph --decorate -n 20 alias llls -lah改完source ~/.bashrc生效。我習(xí)慣把git的常用操作也建一套alias省下來的時間積少成多。7.2 history找到你曾經(jīng)敲過的命令命令記不住沒關(guān)系shell會替你記。# 查看歷史命令 history # 搜索歷史命令 history | grep gunicorn # 直接執(zhí)行歷史記錄中的第100條 !100還有一個技巧終端里按Ctrlr進入反向搜索輸入關(guān)鍵字會自動提示最近匹配的命令。比history | grep更順手。7.3 組合使用管道符的威力Linux命令的哲學(xué)是一個工具只干一件事多個工具通過管道串聯(lián)成一條流水線。# 查看當(dāng)前目錄下最大的10個文件 find . -type f -exec du -h {} | sort -rh | head -n 10 # 統(tǒng)計日志中各個IP的訪問次數(shù) awk {print $1} access.log | sort | uniq -c | sort -rn | head -n 10這兩個例子分別用了finddusorthead以及awksortuniqsorthead。單獨看每個命令都很簡單但串起來就能在幾十秒內(nèi)完成原本要寫幾十行Python腳本才能做的數(shù)據(jù)分析。7.4 一鍵重跑部署任務(wù)的思路部署流程重復(fù)且機械適合寫成一個Shell腳本。比如我常用的一個更新腳本#!/bin/bash set -e echo pull code git pull origin main echo install dependencies source venv/bin/activate pip install -r requirements.txt echo migrate python manage.py migrate --noinput echo collect static python manage.py collectstatic --noinput echo restart service sudo systemctl restart myblog echo doneset -e表示任何一條命令失敗就立即退出避免在錯誤狀態(tài)下繼續(xù)跑后續(xù)步驟。腳本寫好后chmod x deploy.sh ./deploy.sh把重復(fù)勞動腳本化是初級開發(fā)到高級開發(fā)的一個重要分水嶺。7.5 開發(fā)中的一個小技巧Python -m http.server有時候你想臨時起一個簡單的HTTP服務(wù)讓人下載文件或者測試頁面# 在當(dāng)前目錄啟動一個HTTP服務(wù)默認(rèn)端口8000 python3 -m http.server 8000這個命令對Python開發(fā)者來說等于內(nèi)置了一個輕量的靜態(tài)文件服務(wù)器調(diào)試前端代碼、臨時分享文件都能用。而且它不需要任何第三方庫Python自帶。8. 一些實用的排查工具和思路8.1 strace黑盒排查利器程序跑不起來或者卡住不動日志又什么都沒打。這時候可以用strace跟蹤系統(tǒng)調(diào)用看程序在干什么# 跟蹤某個進程的系統(tǒng)調(diào)用 sudo strace -p 12345 # 跟蹤程序啟動時的系統(tǒng)調(diào)用保存到文件 sudo strace -o trace.log python3 app.pystrace能看到程序打開哪些文件、訪問哪些網(wǎng)絡(luò)端口、報了什么系統(tǒng)級別的錯誤。比如一個常見的場景Python程序啟動時報Permission denied但日志里的錯誤信息很模糊用strace就能看到它到底是哪個文件的權(quán)限不夠。這是找不到日志原因時的終極大殺器。8.2 lsof文件和端口的對應(yīng)關(guān)系lsof能列出進程打開的文件和網(wǎng)絡(luò)端口# 查看某個文件被哪個進程占用 lsof app.log # 查看某個用戶打開的所有文件 lsof -u deploy # 查看某個端口被哪個進程監(jiān)聽 lsof -i :8000有人說ss已經(jīng)能看端口占用為什么還要lsof因為lsof的視角更偏文件比如你想知道這個日志文件被誰一直占用導(dǎo)致磁盤刪不掉用lsof就能快速定位。8.3 快速定位CPU占用高的Python代碼如果你發(fā)現(xiàn)線上某個Python服務(wù)CPU飆高可以這樣快速定位# 1. 找到CPU占用最高的進程 top -o %CPU # 2. 把進程轉(zhuǎn)成線程號 # 記下PID然后用 top -Hp 看線程 top -Hp PID # 3. 用py-spy直接采樣Python調(diào)用棧重點 sudo py-spy dump --pid PIDpy-spy是一個專門針對Python進程的采樣工具不需要重啟服務(wù)就能看到當(dāng)前Python代碼執(zhí)行到了哪一行。比用gdb折騰半天高效多了。安裝方式pip install py-spy8.4 查看服務(wù)運行時間的uptimeuptimeuptime會顯示系統(tǒng)運行時間、當(dāng)前登錄用戶數(shù)、以及1/5/15分鐘的平均負(fù)載。如果負(fù)載持續(xù)很高說明系統(tǒng)處于過載狀態(tài)需要結(jié)合top看是CPU-bound還是內(nèi)存不足導(dǎo)致的swap頻繁。9. 最后再聊點實在的坦白說Linux命令這個東西光看不練一點用都沒有。你把這篇文章里的命令挨個敲一遍比背十遍命令手冊都管用。我自己也是從一個命令在一個項目里被坑了三次才記住的狀態(tài)過來的踩坑不可怕關(guān)鍵是每次踩坑之后能把對應(yīng)的命令和思路沉淀下來。我個人的體會是不必追求把所有命令都背得滾瓜爛熟你只需要記住每個場景下有哪些工具可以用具體參數(shù)忘了就man或者--help。比如grep的參數(shù)那么多常用的就是-n -i -C其他參數(shù)真要用了現(xiàn)查也不遲。還有一個建議是盡量養(yǎng)成在Linux環(huán)境下開發(fā)的好習(xí)慣不是讓你完全拋棄IDE和圖形界面而是說寫代碼、跑測試、看日志這些操作能到命令行做的就到命令行做。這樣你會發(fā)現(xiàn)真正上服務(wù)器部署排錯的時候一切都很自然不會有一種我是在另一個世界干活的割裂感。工具是死的思路是活的。把這些命令串起來形成一套屬于自己的排查路徑比記住任何單個命令都重要。