我的Linux手冊
基礎安裝
# CentOSnsudo yum install epel-releasen
命令行Tips
進程及埠
# 查看埠佔用情況nnetstat -ap | grep 埠號 # 查看某一個埠nnetstat -ntlpntop -p 進程ID:查看進程的實時情況,包括內存大小,內存佔用率、CPU佔用率,運行時間ncat /proc/進程ID/status:查看進程詳細信息,包括線程數,線程名稱,線程狀態,佔用內存大小npstree -p 進程ID:查看線程的進程數以及進程IDnlsof -i :埠號 # 查看埠佔用情況,不僅能看到哪個進程開啟的埠,還能查看誰在使用該埠nlsof -i -n -P | egrep :8000.+ESTABLISHED # 查看8000埠的連接列表nlsof -i -n -P | egrep -c :8000.+ESTABLISHED # 查看8000埠的連接數字nn# 結束進程nkill -s 9 進程IDn
查找與統計
ls -lR | grep "^-" | wc -l # 遞歸統計文件夾下所有文件的個數nwc -l: 統計行數ngrep -c "詞語" # 統計出現的次數ngrep 字元串 文件名 # 在文件中查找某個字元串ngrep ^字元串 文件名 # 在文件中查找以某字元串開始的行ngrep [0-9] 文件名 # 在文件中查找包含數字的行ngrep 字元串 -r 目錄 # 在特定目錄及其子目錄中的文件查找strnfdupes:快速查找重複文件nfind / -name filename # 精確查找某個文件nfind / -name *.txt # 模糊查找某個文件nfind / -mmin -60 # 查找60分鐘內修改的文章nfind / -type d -mtime -1 # 查找1天內修改過的文件夾(好吧,我用了rm -rf / 命令才知道的)n
文件操作
# 壓縮ntar -czvf 結果.tar.gz 目標/ # 打包並使用gzip壓縮ntar -cjvf 結果.tar.bz2 目標/ # 打包並使用bzip2壓縮nzip *.zip file # 壓縮file為zip格式nzip -r *.zip file dir # 壓縮文件或目錄一起為zip格式nzip -e 結果.zip 目標 # 壓縮並加密(OSX可用)nn# 解壓nxz -d *.tar.xzntar xvf *.tarntar zxvf *.tgzntar -xjf tar.bz2 # 解壓bz2文件ngunzip *.gz # 解壓gz文件ntar -xzf *.tar.gznn# 複製ncp 文件1 文件2ncp -r 目錄1 目錄2 # 遞歸複製ncp -a 目錄1 目錄2 # 遞歸複製目錄,同時將文件屬性也複製過去nn# 文件分割nsplit -b 1024m # 文件分隔-b表示按大小分隔,-l表示按行數分隔nn# 查看文件內容ncat filename | more # 表示分頁查看文件內容nn# 輸出內容到文件ncat ./test.conf >> /etc/supervisord.confnsudo bash -c cat ./test.conf >> /etc/supervisord.conf # 上一句如果出現許可權問題可以嘗試使用這條命令nn# 建立鏈接,最好都用絕對路徑n軟連接:ln -s 源 目的地n軟連接可以給目錄創建,如果刪除了對源文件不會有影響n硬連接:ln -d 源 目的地n硬連接不能給目錄創建,對連接做的更改會影響源文件,只能在同一文件系統中創建nn# 文件創建nmkdir -p path/2 # 創建目錄樹nmkdir -pv path/{path1,path2} # 建立子目錄nmkdir -v a+wt path # 創建一個粘滯模式的文件,其他用戶可以修改,但是只有該文件的owner才能進行刪除操作,這條命令即使把0755(rwxr-xr-x)改為1777(rwxrwxrwt)nn# 找不同ndiff 文件1 文件2 # 找出兩個文件的不同nsdiff 文件1 文件2 # 以對比的方式找文件的不同nn# 批量轉換文件編碼nfind *.txt -exec sh -c "iconv -f GBK -t UTF8 {} > change.{}" ; # 這裡將GBK轉換為UTF8n
遠程ssh
# 配置免密碼登錄nssh-keygen -t dsa # 生成自己的ssh,然後將~/.ssh/id_dsa.pub的內容添加到主機的~/.ssh/authorized_keys裡面面去nn# CentOS下的安裝nyum install openssh-clientsnn# 傳輸文件nscp 用戶名@地址:遠程路徑 本地路徑 # 獲取/下載遠程伺服器的文件,目錄加-r參數nscp 本地路徑 用戶名@地址:遠程路徑 # 將本地文件上傳到遠程目錄,目錄加-rnn# 僅允許SSH登錄,vim /etc/ssh/sshd_confnPubkeyAuthentication yesnAuthorizedKeysFile .ssh/authorized_keysnPasswordAuthentication nonn#保存,然後重啟ssh服務nservice sshd restartnn# 進位特定IP登錄,vim /etc/hosts.denynsshd:IPnn# 登錄shell和非登錄shell的區別: 載入的文件不同,登錄式shell載入/etc/profile、/.bash_profile和~/.profile,而非登錄式shell載入/etc/bashrc或者/etc/bash.bashrc、~/.bash_rc,所以在切換用戶是最好加上-,即su - haofly就切換到那個心的地方了n
包管理
dpkg -i *.deb # 安裝deb包,但是它不會自動解決依賴,安裝完成後還要使用apt-get -f install這條命令來安裝沒有安裝好的依賴napt-cache show 包名 # 顯示apt庫裡面的軟體的版本號nsudo apt-get clean # 自動清理安裝程序時緩存的deb包nsudo apt-get autoclean # 清理已卸載軟體的無用的依賴包nrpm -ql 包名 # 查詢已經安裝的包的文件路徑n
磁碟管理
sudo fdisk -lu # 顯示硬碟及分區情況nsudo fdisk /dev/sdb # 對某一硬碟進行分區(千萬不要在當前硬碟進行分區)nsudo mkfs -t ext4 /dev/sdb # 將硬碟格式化為ext4文件系統nsudo df -lh # 顯示硬碟掛載情況nsudo mount -t ext4 /dev/sdb /mydata # 掛載某個分區文件為ext4nvim /etc/fstab中添加nUUID=硬碟的UUID /掛載位置 ext4 defaults 0 0 # 在系統啟動時自動掛載硬碟blkid /dev/sda1 查看硬碟UUID用sudo blkidnnsudo du -h -d 1 /path # 獲取指定目錄下一級的各個目錄的大小n
用戶管理
# 添加用戶nsudo useradd -s /bin/bash -d /home/username -m usernamenn# 修改用戶密碼nsudo passwd usernamenn# 給用戶添加sudo許可權nvim /etc/sudoers 修改如下內容n# User privilege specification nroot ALL=(ALL:ALL) ALL # 在這一行下面寫 nusername1 ALL=(ALL:ALL) ALL # 該用戶可以執行所有sudo操作nusername2 ALL=NOPASSWD:/usr/bin/git # 該用戶可以執行sudo git的操作nn# 查看所有用戶ncat /etc/passwd n
系統相關
lsb_release -a // 查看系統信息necho $HOSTTYPE // 查看系統位數ncat /proc/cpuinfo # 查看CPU信息ncat /etc/issue // Debian系列查看系統版本ncat /etc/redhat-release // redhat系列查看系統版本nn# 更新系統nsudo apt-get install update-manager-corensudo do-release-upgradenn# 系統開關nshutdown -h now # 關機nshutdown -r now # 重啟nn# 查看某個命令的系統調用nstrace + 命令: 這條命令十分強大,可以定位你程序到底是哪個地方出了問題nn# 增加虛擬內存nsudo dd if=/dev/zero of=/swapfile bs=1024 count=500000 # 500MB,這兩行是連在一起的,我日nsudo mkswap /swapfilensudo chown root:root /swapfilensudo chmod 0600 /swapfilensudo swapon /swapfilen
防火牆
service iptables status # 查詢防火牆狀態nvim /etc/sysconfig/iptables # 新增埠nservice iptables restart # 重啟防火牆n
其它工具
supervisor
進程監控工具,apt-get install supervisor
進行安裝,默認的監控配置都放在/etc/supervisor/conf.d
裡面,配置文件語法如下:
[group:fenzu]nprograms:一個進程名,另一個進程名 # 這樣可以分組控制一批programnn[program:去一個進程名稱]nprocess_name=%(program_name)s_%(process_num)02d # 當前進程的名稱ndirectory=/home/... # 工作目錄,啟動程序前會切換到這個地方ncommand=python manage.py runserver .... # 啟動命令nautostart=true # 在supervisord啟動的時候自動啟動nautorestart=true # 程序異常退出後自動重啟nstartretries=3 # 啟動失敗自動重試次數,默認是3nuser=root # 用哪個用戶啟動nnumprocs=8 # 進程數nredirect_stderr=true # 把stderr重定向到stdout,默認為falsenstdout_logfile=/var/log/... # 日誌文件位置,若該目錄不存在則無法正常啟動,需要手動創建目錄n
常用操作
supervisord # 啟動所有監控 n
CURL
curl -o a.txt url # 將文件下載到本地並命名為a.txtncurl -O url # 將文件下載到本地用它本來的命名n
FTP
Crontab定時任務
crontab -e # 直接打開定時任務文件進行編輯n格式如下:n第1列:分鐘n第2列:小時n第3列:日n第4列:月n第5列:星期n第6列:命令n其中,每一列可以逗號和小橫線表示特殊的意義,比如n3,15 8-11 * * * 命令 # 表示在上午8點到11點的第3和15分鐘執行n* 23 * * * 命令 # 注意這個表示的是23點的每分鐘都執行n0 */1 * * * 命令 # 每隔一小時n需要注意的是coontab是不會自動載入環境變數的喲,所以有時候發現命令沒有被執行,可能是這個原因nn# crontab日誌,默認是關閉的,如果要打開可以在配置文件裡面進行打開,vim /etc/rsyslog.d/50-defaullt.confncron.* /var/log/cron.log # 將cron前面的注釋去掉nservice rsyslog restart # 重啟rsyslogn
其他命令
cd -: 返回上一次的目錄,真他媽實用nhistory:查看歷史命令,如果需要查看命令執行時間,需要先export HISTTIMEFORMAT=%F %T ntzselect:更改時區n# 命令命名,例如如果想通過python命令調用python3而不是默認的python2,那麼可以這樣子:nalias python=python3nalias pip=pip3nalias run8000=python manage.py runserver 0.0.0.0:8000nn# yes命令:重複輸出字元串,不帶參數則默認輸出y。例如 `yes | apt-get install xxx`會默認輸出ynn# 網路相關nifdown eth0 # 禁用eth網卡nifup eth0nn# 隨機數necho $RANDOMnn# 除法necho $RANDOM / 28 | bcnecho $RANDOM % 28 | bcn
Shell Script
數據結構
VAR2=${VAR:-haofly} # 如果變數VAR不存在,後面就是它的默認值nVAR2=${VAR/.tar.gz} # 如果VAR的值為haofly.tar.gz,那麼VAR2=haofly,一種替換nlength=$(#array[@]}或者length=$(#array[*]} # 獲取數組長度n
流程式控制制
if語句:n -z:為空n -n:不為空n -gt:大於n n# 判斷文件是否存在nif [ ! -f "$filename" ]; thenntouch "$filename"nfinn# 判斷文件是否為空nif [[ ! -s filename ]]; thennecho anfin
特殊符號
[[]]:雙中括弧,之間的字元不會發生文件名擴展或者單詞分割n(()):雙小括弧,整數擴展,其中的變數可以不適用$符號前綴n$?:上一條命令的退出碼n
日期處理
date +"%s" # 按照時間戳來顯示ndate +"%m-%d-%y" # mm-dd-yy格式ndate +"%T" # 僅顯示時間,比如10:44:00 n
隨機數
$RANDOM # 生成一個隨機數特殊操作
. /etc/*.conf # 導入配置文件,這樣配置文件裡面的變數就可以直接使用了find ./ -name "*.log" -mtime -1 | which read line; do tail -n 5 "$line" > ~/bak/"$line"; done # 查找,然後按行進行執行nwhile read line do 語句 done # 一行一行地進行處理,真正的處理nn# awk:以行為單位將輸入進行處理,貌似這裡的處理智能進行printn -F 參數將行做分割,例如:ps | awk -F {print $1} # 將ps的第二列輸出nn# sed:同樣以行為單位將輸入進行處理n -n 輸出第幾行,例如:ps | sed -n 1p # 將ps的第一行輸出nn# xargs:將上一個管道的輸出直接作為這個管道的輸入n ps | grep python | awk -F {print $1} | xargs killnndate+%Y-%m-%d # 獲取今天的日期n
你想更深入了解學習Linux知識體系,你可以看一下我們花費了一個多月整理了上百小時的幾百個知識點體系內容:
【超全整理】《Linux雲計算從入門到精通》系列實戰筆記全放送
推薦閱讀:
※做linux kernel相關研究的如何創(zhuan)業(qian)?
※Linux運維工程師必備的80個監控工具全集
※APUE第二版封面的漫畫什麼意思?
※Linux常用命令