
linux.jpg
原文鏈接
基礎(chǔ)安裝
# CentOS
sudo yum install epel-release
命令行Tips
進程及端口
# 查看端口占用情況
netstat -ap | grep 端口號 # 查看某一個端口
netstat -ntlp
top -p 進程ID:查看進程的實時情況,包括內(nèi)存大小,內(nèi)存占用率、CPU占用率,運行時間
cat /proc/進程ID/status:查看進程詳細信息,包括線程數(shù),線程名稱,線程狀態(tài),占用內(nèi)存大小
pstree -p 進程ID:查看線程的進程數(shù)以及進程ID
lsof -i :端口號 # 查看端口占用情況,不僅能看到哪個進程開啟的端口,還能查看誰在使用該端口
lsof -i -n -P | egrep ':8000.+ESTABLISHED' # 查看8000端口的連接列表
lsof -i -n -P | egrep -c ':8000.+ESTABLISHED' # 查看8000端口的連接數(shù)字
# 結(jié)束進程
kill -s 9 進程ID
查找與統(tǒng)計
ls -lR | grep "^-" | wc -l # 遞歸統(tǒng)計文件夾下所有文件的個數(shù)
wc -l: 統(tǒng)計行數(shù)
grep -c "詞語" # 統(tǒng)計出現(xiàn)的次數(shù)
grep 字符串 文件名 # 在文件中查找某個字符串
grep ^字符串 文件名 # 在文件中查找以某字符串開始的行
grep [0-9] 文件名 # 在文件中查找包含數(shù)字的行
grep 字符串 -r 目錄 # 在特定目錄及其子目錄中的文件查找str
fdupes:快速查找重復(fù)文件
find / -name filename # 精確查找某個文件
find / -name '*.txt' # 模糊查找某個文件
find / -mmin -60 # 查找60分鐘內(nèi)修改的文章
find / -type d -mtime -1 # 查找1天內(nèi)修改過的文件夾(好吧,我用了rm -rf / 命令才知道的)
文件操作
# 壓縮
tar -czvf 結(jié)果.tar.gz 目標/ # 打包并使用gzip壓縮
tar -cjvf 結(jié)果.tar.bz2 目標/ # 打包并使用bzip2壓縮
zip *.zip file # 壓縮file為zip格式
zip -r *.zip file dir # 壓縮文件或目錄一起為zip格式
zip -e 結(jié)果.zip 目標 # 壓縮并加密(OSX可用)
# 解壓
xz -d *.tar.xz
tar xvf *.tar
tar zxvf *.tgz
tar -xjf tar.bz2 # 解壓bz2文件
gunzip *.gz # 解壓gz文件
tar -xzf *.tar.gz
# 復(fù)制
cp 文件1 文件2
cp -r 目錄1 目錄2 # 遞歸復(fù)制
cp -a 目錄1 目錄2 # 遞歸復(fù)制目錄,同時將文件屬性也復(fù)制過去
# 文件分割
split -b 1024m # 文件分隔-b表示按大小分隔,-l表示按行數(shù)分隔
# 查看文件內(nèi)容
cat filename | more # 表示分頁查看文件內(nèi)容
# 輸出內(nèi)容到文件
cat ./test.conf >> /etc/supervisord.conf
sudo bash -c 'cat ./test.conf >> /etc/supervisord.conf' # 上一句如果出現(xiàn)權(quán)限問題可以嘗試使用這條命令
# 建立鏈接,最好都用絕對路徑
軟連接:ln -s 源 目的地
軟連接可以給目錄創(chuàng)建,如果刪除了對源文件不會有影響
硬連接:ln -d 源 目的地
硬連接不能給目錄創(chuàng)建,對連接做的更改會影響源文件,只能在同一文件系統(tǒng)中創(chuàng)建
# 文件創(chuàng)建
mkdir -p path/2 # 創(chuàng)建目錄樹
mkdir -pv path/{path1,path2} # 建立子目錄
mkdir -v a+wt path # 創(chuàng)建一個粘滯模式的文件,其他用戶可以修改,但是只有該文件的owner才能進行刪除操作,這條命令即使把0755(rwxr-xr-x)改為1777(rwxrwxrwt)
# 找不同
diff 文件1 文件2 # 找出兩個文件的不同
sdiff 文件1 文件2 # 以對比的方式找文件的不同
# 批量轉(zhuǎn)換文件編碼
find *.txt -exec sh -c "iconv -f GBK -t UTF8 {} > change.{}" \; # 這里將GBK轉(zhuǎn)換為UTF8
遠程ssh
# 配置免密碼登錄
ssh-keygen -t dsa # 生成自己的ssh,然后將~/.ssh/id_dsa.pub的內(nèi)容添加到主機的~/.ssh/authorized_keys里面面去
# CentOS下的安裝
yum install openssh-clients
# 傳輸文件
scp 用戶名@地址:遠程路徑 本地路徑 # 獲取/下載遠程服務(wù)器的文件,目錄加-r參數(shù)
scp 本地路徑 用戶名@地址:遠程路徑 # 將本地文件上傳到遠程目錄,目錄加-r
# 僅允許SSH登錄,vim /etc/ssh/sshd_conf
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
PasswordAuthentication no
#保存,然后重啟ssh服務(wù)
service sshd restart
# 進制特定IP登錄,vim /etc/hosts.deny
sshd:IP
# 登錄shell和非登錄shell的區(qū)別: 加載的文件不同,登錄式shell加載/etc/profile、/.bash_profile和~/.profile,而非登錄式shell加載/etc/bashrc或者/etc/bash.bashrc、~/.bash_rc,所以在切換用戶是最好加上-,即su - haofly就切換到那個心的地方了
包管理
dpkg -i *.deb # 安裝deb包,但是它不會自動解決依賴,安裝完成后還要使用apt-get -f install這條命令來安裝沒有安裝好的依賴
apt-cache show 包名 # 顯示apt庫里面的軟件的版本號
sudo apt-get clean # 自動清理安裝程序時緩存的deb包
sudo apt-get autoclean # 清理已卸載軟件的無用的依賴包
rpm -ql 包名 # 查詢已經(jīng)安裝的包的文件路徑
磁盤管理
sudo fdisk -lu # 顯示硬盤及分區(qū)情況
sudo fdisk /dev/sdb # 對某一硬盤進行分區(qū)(千萬不要在當前硬盤進行分區(qū))
sudo mkfs -t ext4 /dev/sdb # 將硬盤格式化為ext4文件系統(tǒng)
sudo df -lh # 顯示硬盤掛載情況
sudo mount -t ext4 /dev/sdb /mydata # 掛載某個分區(qū)文件為ext4
vim /etc/fstab中添加
UUID=硬盤的UUID /掛載位置 ext4 defaults 0 0 # 在系統(tǒng)啟動時自動掛載硬盤blkid /dev/sda1 查看硬盤UUID用sudo blkid
sudo du -h -d 1 /path # 獲取指定目錄下一級的各個目錄的大小
用戶管理
# 添加用戶
sudo useradd -s /bin/bash -d /home/username -m username
# 修改用戶密碼
sudo passwd username
# 給用戶添加sudo權(quán)限
vim /etc/sudoers 修改如下內(nèi)容
# User privilege specification
root ALL=(ALL:ALL) ALL # 在這一行下面寫
username1 ALL=(ALL:ALL) ALL????# 該用戶可以執(zhí)行所有sudo操作
username2 ALL=NOPASSWD:/usr/bin/git # 該用戶可以執(zhí)行'sudo git'的操作
# 查看所有用戶
cat /etc/passwd
系統(tǒng)相關(guān)
lsb_release -a // 查看系統(tǒng)信息
echo $HOSTTYPE // 查看系統(tǒng)位數(shù)
cat /proc/cpuinfo # 查看CPU信息
cat /etc/issue // Debian系列查看系統(tǒng)版本
cat /etc/redhat-release // redhat系列查看系統(tǒng)版本
# 更新系統(tǒng)
sudo apt-get install update-manager-core
sudo do-release-upgrade
# 系統(tǒng)開關(guān)
shutdown -h now # 關(guān)機
shutdown -r now # 重啟
# 查看某個命令的系統(tǒng)調(diào)用
strace + 命令: 這條命令十分強大,可以定位你程序到底是哪個地方出了問題
# 增加虛擬內(nèi)存
sudo dd if=/dev/zero of=/swapfile bs=1024 count=500000 # 500MB,這兩行是連在一起的,我日
sudo mkswap /swapfile
sudo chown root:root /swapfile
sudo chmod 0600 /swapfile
sudo swapon /swapfile
防火墻
service iptables status # 查詢防火墻狀態(tài)
vim /etc/sysconfig/iptables # 新增端口
service iptables restart # 重啟防火墻
其它工具
supervisor
進程監(jiān)控工具,apt-get install supervisor進行安裝,默認的監(jiān)控配置都放在/etc/supervisor/conf.d里面,配置文件語法如下:
[group:fenzu]
programs:一個進程名,另一個進程名 # 這樣可以分組控制一批program
[program:去一個進程名稱]
process_name=%(program_name)s_%(process_num)02d # 當前進程的名稱
directory=/home/... # 工作目錄,啟動程序前會切換到這個地方
command=python manage.py runserver .... # 啟動命令
autostart=true # 在supervisord啟動的時候自動啟動
autorestart=true # 程序異常退出后自動重啟
startretries=3 # 啟動失敗自動重試次數(shù),默認是3
user=root # 用哪個用戶啟動
numprocs=8 # 進程數(shù)
redirect_stderr=true # 把stderr重定向到stdout,默認為false
stdout_logfile=/var/log/... # 日志文件位置,若該目錄不存在則無法正常啟動,需要手動創(chuàng)建目錄
常用操作
supervisord # 啟動所有監(jiān)控
CURL
curl -o a.txt url # 將文件下載到本地并命名為a.txt
curl -O url # 將文件下載到本地用它本來的命名
FTP
Crontab定時任務(wù)
crontab -e # 直接打開定時任務(wù)文件進行編輯
格式如下:
第1列:分鐘
第2列:小時
第3列:日
第4列:月
第5列:星期
第6列:命令
其中,每一列可以逗號和小橫線表示特殊的意義,比如
3,15 8-11 * * * 命令 # 表示在上午8點到11點的第3和15分鐘執(zhí)行
* 23 * * * 命令 # 注意這個表示的是23點的每分鐘都執(zhí)行
0 */1 * * * 命令 # 每隔一小時
需要注意的是coontab是不會自動加載環(huán)境變量的喲,所以有時候發(fā)現(xiàn)命令沒有被執(zhí)行,可能是這個原因
# crontab日志,默認是關(guān)閉的,如果要打開可以在配置文件里面進行打開,vim /etc/rsyslog.d/50-defaullt.conf
cron.* /var/log/cron.log # 將cron前面的注釋去掉
service rsyslog restart # 重啟rsyslog
其他命令
cd -: 返回上一次的目錄,真他媽實用
history:查看歷史命令,如果需要查看命令執(zhí)行時間,需要先export HISTTIMEFORMAT='\%F \%T '
tzselect:更改時區(qū)
# 命令命名,例如如果想通過python命令調(diào)用python3而不是默認的python2,那么可以這樣子:
alias python=python3
alias pip=pip3
alias run8000='python manage.py runserver 0.0.0.0:8000'
# yes命令:重復(fù)輸出字符串,不帶參數(shù)則默認輸出y。例如 `yes | apt-get install xxx`會默認輸出y
# 網(wǎng)絡(luò)相關(guān)
ifdown eth0 # 禁用eth網(wǎng)卡
ifup eth0
# 隨機數(shù)
echo $RANDOM
# 除法
echo $RANDOM / 28 | bc
echo $RANDOM % 28 | bc
Shell Script
數(shù)據(jù)結(jié)構(gòu)
VAR2=${VAR:-haofly} # 如果變量VAR不存在,后面就是它的默認值
VAR2=${VAR/.tar.gz} # 如果VAR的值為haofly.tar.gz,那么VAR2=haofly,一種替換
length=$(#array[@]}或者length=$(#array[*]} # 獲取數(shù)組長度
流程控制
if語句:
-z:為空
-n:不為空
-gt:大于
# 判斷文件是否存在
if [ ! -f "$filename" ]; then
touch "$filename"
fi
# 判斷文件是否為空
if [[ ! -s filename ]]; then
echo 'a'
fi
特殊符號
[[]]:雙中括號,之間的字符不會發(fā)生文件名擴展或者單詞分割
(()):雙小括號,整數(shù)擴展,其中的變量可以不適用$符號前綴
$?:上一條命令的退出碼
日期處理
date +"%s" # 按照時間戳來顯示
date +"%m-%d-%y" # mm-dd-yy格式
date +"%T" # 僅顯示時間,比如10:44:00
隨機數(shù)
$RANDOM # 生成一個隨機數(shù)
特殊操作
. /etc/*.conf # 導入配置文件,這樣配置文件里面的變量就可以直接使用了
find ./ -name "*.log" -mtime -1 | which read line; do tail -n 5 "$line" > ~/bak/"$line"; done # 查找,然后按行進行執(zhí)行
while read line do 語句 done # 一行一行地進行處理,真正的處理
# awk:以行為單位將輸入進行處理,貌似這里的處理智能進行print
-F 參數(shù)將行做分割,例如:ps | awk -F ' ' '\{print $1\}' # 將ps的第二列輸出
# sed:同樣以行為單位將輸入進行處理
-n 輸出第幾行,例如:ps | sed -n '1p' # 將ps的第一行輸出
# xargs:將上一個管道的輸出直接作為這個管道的輸入
ps | grep python | awk -F ' ' '\{print $1\}' | xargs kill
date+\%Y-\%m-\%d # 獲取今天的日期