> 更多常用命令可參考
> https://tool.lu/command/
[TOC]
### 學會查看幫助文檔 man
```
man ln
```
### centos 常用目錄
> **/usr/bin/** 存放系統預裝的可執行程序。系統升級后,如果重名會被覆蓋掉。
> **/usr/local/bin/** 存放自己的可執行程序的地方,系統升級,不會被覆蓋,并且local的優先級高于前者。
> 很多源碼安裝的程序,就需要把執行程序放入該目錄 **/usr/bin/** 或 **/usr/local/bin/**
> **/usr/local/** 或 **/opt/** :用戶下載的軟件存放的地方,我比較喜歡使用 **/opt/**
### 源碼安裝步驟
#### 1. 執行configure,生成Makefile文件
```
./configure --prefix=/opt/nginx/
```
> 此時當前目錄下將會生成一個Makefile文件。
> * 注意:--prefix參數指定軟件安裝目錄。當執行make install命令時,會將軟件安裝在此路徑中。
#### 2. 執行make,從Makefile中讀取指令,編譯源碼
```
make clean; make
```
> 此時make會讀取Makefile文件,將源碼編譯成二進制文件,并存放在當前目錄下。
#### 3. 執行make install,將軟件安裝至指定目錄
```
make install
```
> 此時二進制文件會被安裝到先前configure prefix參數設置的路徑中去。至此安裝完成!
### PHPIZE安裝
~~~
phpize # 生成配置文件
./configure --with-php-config=/my_php_path/bin/php-config # 配置
make && make install # 編譯和安裝
~~~
### linux 符號
#### 后臺執行符號 (&)
> 表示任務在后臺執行
> vim cron.sh
> 表示該shell再同時間啟動兩個后臺進程,該shell可以防止到crontab里進行每分鐘調用
~~~
#!/bin/sh
/usr/bin/php /var/www/html/yii2/yii task/todo1 &
/usr/bin/php /var/www/html/yii2/yii task/todo2 &
~~~
#### 命令控制符 (&&)
> 格式:command1 && command2
> 如果command1執行成功,才會執行command2
#### 管道 ( | )
> 上一條命令的輸出,作為下一條命令參數
~~~
echo 'yes' | wc -l
~~~
### vim 使用技巧
> 命令模式下
```
gg # 跳自第一行
G #跳自末尾
dd # 刪除當前行
D # 刪除光標至行尾
ggdG #刪除全部
:set nu # 顯示行號
: number #跳轉行號
```
> /usr/bin/php
### 使用RZ 或 SZ
```
yum install -y lrzsz
sz #Shell中 下載服務器的文件至本地
rz #Shell中 上傳文件至服務器
```
### 使用htop
> 安裝方式
~~~
yum install htop
~~~
> 使用教程
> 待續中
### 查看某個命令的路徑
```
which php
```
> /usr/bin/php
### 設置開機啟動
~~~
chkconfig mysqld on #設置mysql進程開機啟動
chkconfig iptables off #設置防火墻開機不啟動,因為iptables禁用了80端口。
chkconfig -–list # 查看所有的開機啟動情況
chkconfig -–list httpd #查看Apache的開機啟動情況
# 如下場景,源碼方式安裝mysql,設置mysqld命令自啟動。
cp /opt/mysql/support-files/mysql.server /etc/init.d/mysqld
chmod 777 /etc/init.d/mysqld
chkconfig mysqld on
~~~
### 用戶組操作
~~~
groupadd mysql # 添加mysql組
useradd -r -g mysql mysql #添加mysql用戶到mysql組
groups mysql #查看mysql用戶屬于哪個組
chown -R www:www /opt/nginx/ #修改文件所屬用戶
~~~
### 文件權限操作
~~~
chown -R www:www folder2 #folder2文件夾遞歸修改用戶擁有組和組
chmod -R 777 folder2 # folder2文件夾遞歸修改為777權限,7 =4(讀)+2(寫)+1(執行)
ll #查看文件權限
#-rwxr-xr-x 1 root root 2405 Jun 5 2017 php-fpm-71
#前10個字母中第一個字母,代表類型“-(文件) / d(文件夾)”
#第一組字母 rwx 所有者(user)權限 (讀 & 寫 & 執行)
#第二組字母 r-x 組群(group)權限 (讀 & 不可寫 & 執行)
#第三組字母 r-x 其他人(other)權限 (讀 & 不可寫 & 執行)
~~~
### 查找是否安裝某個軟件
> 一般centos會自帶apache,這個時候需要先刪除再安裝自己的版本
~~~
rpm -qa | grep http* #RPM下查找是否安裝Apache
yum list installed | grep http* #YUM下查找是否安裝Apache
~~~
### 軟連接 ln -s
~~~
ln -s /var/www.zhuifanba.com/ new_symbolic # ln -s 源文件夾 目標文件夾
~~~
### 根據文件名查找
~~~
find /home/wangkun/ -name robots.txt #根據《文件名》進行查找
find /home/wangkun/ -name '*rob*' #文件名模糊查找
~~~
### 文件內容的查看
~~~
tail -n 500 app.log #查看前500行的內容
tail -n 500 app.log | grep Baiduspider
cat app.log | grep Baiduspider #雷同以上
tail -n 500 app.log > 1.log
tail -f xx.log #實時查看文件動態變化
#要查找某個東西,也可以用vim,在命令格式里輸入“/”,然后輸入“apply”,就可以查找到了,查看下一個,用N即可。
~~~
### 壓縮命名
~~~
tar zcvf filename.tar.gz dirname #壓縮
tar zxvf filename.tar.gz #解壓
tar zxvf filename.tar.gz -C haha/ #解壓到haha目錄
~~~
### 下載文件
~~~
wget http://nginx.org/download/nginx-1.10.3.tar.gz #下載到當前文件夾
wget -O php-7.1.2.tar.gz http://cn2.php.net/get/php-7.1.2.tar.gz/from/this/mirror #下載文件后,重命名為“php-7.1.2.tar.gz”
~~~
### 刪除當前文件夾下的所有文件
~~~
rm -rf *
~~~
### 查看linux 內核版本
> 當使用uname -a查看時,如果有x86_64則為64位,否則為32位
~~~
uname -a #在版本信息中可得知是32位還是64位
> Linux localhost.localdomain 2.6.18-194.el5 #1 SMP Fri Apr 2 14:58:14 EDT 2010 x86_64 x86_64 x86_64 GNU/Linux
cat /etc/redhat-release #查看centos版本
> CentOS Linux release 7.3.1611 (Core)
~~~
### awk的用法
> awk '{動作}'
> awk -F '分割符' '{動作}'
> 日志內容
```
223.104.108.11 - - [03/Nov/2019:22:53:08 +0800] "POST /api/sign/get-sign-award HTTP/2.0" 200 64 "-" "fan bei/1.1.6 (iPhone; iOS 11.2.6; Scale/2.00)"
223.104.108.11 - - [03/Nov/2019:22:53:08 +0800] "POST /api/sign/index HTTP/2.0" 200 3954 "-" "fan bei/1.1.6 (iPhone; iOS 11.2.6; Scale/2.00)"
```
> 測試
```
cat haha.txt| awk -F ':' '{print $1}'
```
### NGINX日志分析
> 日志內容
```
223.104.108.11 - - [03/Nov/2019:22:53:08 +0800] "POST /api/sign/get-sign-award HTTP/2.0" 200 64 "-" "fan bei/1.1.6 (iPhone; iOS 11.2.6; Scale/2.00)"
223.104.108.11 - - [03/Nov/2019:22:53:08 +0800] "POST /api/sign/index HTTP/2.0" 200 3954 "-" "fan bei/1.1.6 (iPhone; iOS 11.2.6; Scale/2.00)"
```
> https://blog.csdn.net/lupeng0206/article/details/59105790
> 批注: 如果要統計實時的,可以先將tail -f 的內容輸入到haha.txt文檔里,然后再對haha.txt進行統計
```
tail -f access.log >> haha.txt
```
> 1. 統計qps
> awk -F 指定分割字符串(不帶默認為空格),獲得最終的訪問時間,然后再進行uniq合并計數
```
cat haha.txt |awk -F ' ' '{print $4}'|uniq -c|sort -k1nr|more
```
> 2. 查詢訪問最頻繁的URL
```
cat haha.txt |awk '{print $7}' |sort | uniq -c |sort -k1nr|more
```
> 3. 查詢訪問最頻繁的IP
~~~
cat haha.txt |awk '{print $1}' |sort | uniq -c |sort -k1nr|more
~~~
> 4. 根據時間段統計查看日志
~~~
cat access.log| sed -n '/14\/Mar\/2015:21/,/14\/Mar\/2015:22/p'|more
~~~
> 6. 根據某接口的統計
~~~
cat haha.txt|grep 'demo.php'
~~~
### 日志分析
> 更多參考:http://www.cnblogs.com/xd502djj/archive/2011/03/01/1968041.html
~~~
grep -r "phpfpm_71_status" /www/server/ # 查找某個目錄下包含“xx關鍵詞”
grep 'Baiduspider' * # 當前文件夾下的所有文件,含有“Baiduspider”的打印出來
grep 'Baiduspider' -r -c -i # ( -r 當前文件夾下進行遞歸) ( -c 顯示總共有多少行被匹配到了) (-i 忽略大小寫)
cat www.zhuifan8.com.log | grep 'Baiduspider' # 該文件含有“Baiduspider”的打印出來
cat haha.log | grep 'Baiduspider' -c # 統計haha.log里含有多少個“Baiduspider”訪問記錄
cat haha.log | grep 'Baiduspider' | wc -l #同上,使用的是wc命令進行行數的統計
cat www.zhuifan8.com.log |grep 'Baiduspider' | grep '24/Aug' #既統計"Baiduspider"又統計“日期(24號)”的數據
cat www.zhuifan8.com.log |grep 'Baiduspider' | head -n 10 # 讀取"Baiduspider"訪問記錄的前10條。最后10條,可使用 tail -n 10
cat www.zhuifan8.com.log |grep 'Baiduspider'|awk '{print $7}'|sort|uniq -c|sort -r #統計被百度訪問次數訪問的頁面記錄
cat www.zhuifan8.com.log |grep 'Baiduspider'|awk '{print $7}'|sort|uniq -c|sort -r|awk '$1>100{print $1,$2}' #統計訪問次數超過100的頁面記錄
~~~
### 磁盤情況查看 (磁盤空間不足排查) [概要查詢]
> -h :√ human-readable 人類可閱讀
> -s :√ summarize 只顯示一條總和數據:所有文件夾的大小總和,默認情況下,是遞歸顯示所有文件夾的數據大小。
~~~
df -h #disk free,查看整體磁盤空間大小情況
du -sh /* # disk useage先查看根目錄下,所有文件夾占用情況
du -sh /usr/* # 當發現usr占用比較大,就查看其下面的占用情況
du -sh /usr/local/* # ....以此類推
~~~
### top命令 [細節查詢]
> top摘要可以看CPU的情況以及問題所在(如是IO問題,還是系統CPU資源短缺),以及內存概況。
> 按 1:則顯示具體的幾核cpu使用情況
> 按 P:按CPU使用率進行排序
> 按 M:按內存使用率進行排序
~~~
top
top -d 0.5 # 將以0.5秒的時間間隔刷新數據
top -u www #查看www用戶的進程情況
~~~
> **摘要詳解**
> us:(user cpu time) 用戶模式消耗的 CPU 時間百分比。該值較高時,說明用戶進程消耗的 CPU 時間比較多,比如,如果該值長期超過 50%,則需要對程序算法或代碼等進行優化。
> sy:(system cpu time) 內核模式消耗的 CPU 時間百分比。
> wa:(io wait cpu time) IO 等待消耗的 CPU 時間百分比。該值較高時,說明 IO 等待比較嚴重,這可能磁盤大量作隨機訪問造成的,也可能是磁盤性能出現了瓶頸。
> id:(idle cpu time) 處于空閑狀態的 CPU 時間百分比。如果該值持續為 0,同時 sy 是 us 的兩倍,則通常說明系統則面臨著 CPU 資源的短缺。
> **操作命令**
> **A)** 按 1,監控每個cpu的各自占用情況
> **A)** 按大寫 P,監控結果按 CPU 倒序
> **A)** 按大寫 M,監控結果按 MEM 倒序
> **A)** ↑↑↑ 找占用內存或CPU過高的進程,根據對應系統日志和程序自身相關日志,做進一步排查分析,以判斷其占用過高的原因
> **B)** 輸入小寫 k,再輸入pid,再回車確認,即可快速終止的對應pid進程
> **C)** load average 是對 CPU 負載的評估,其值越高,說明其任務隊列越長,處于等待執行的任務越多。
出現此種情況時,可能是由于僵死進程導致的。可以通過指令 ps -aux 查看是否存在 D 狀態進程。D 狀態是指不可中斷的睡眠狀態。該狀態的進程無法被 kill,也無法自行退出。只能通過恢復其依賴的資源或者重啟系統來解決。重啟系統后,再去排查問題所在 https://blog.csdn.net/m0_37886429/article/details/78529681
### ps命令 [細節查詢]
> 查詢出來的結果集參數詳解:
> PID:進程ID
> %CPU:占用CPU百分比
> %MEM:占用內存百分比
> RSS:占用物理內存大小 (以這個為主,單位kb)
> VSZ:占用虛擬內存大小 (單位kb)
> STAT:進程狀態 (D 不可中斷 usually IO / R 正在運行,或在隊列中的進程 / S 處于休眠狀態),這個狀態同樣適用于top里的s狀態
~~~
ps aux | grep nginx #查找nginx的進程情況 (可查看nginx的worker進程數,以及對應占用的CPU和內存情況)
ps aux | grep php-fpm #查找fpm的進程情況 (可查看fpm進程數,以及對應占用的CPU和內存情況)
ps aux | grep mysql #查找mysql的進程情況 (可查看mysql占用的CPU和內存情況)
ps aux | grep php-fpm | grep -v grep | grep -v master | awk '{sum+=$6} END {print sum}' #php-fpm內存占用量
ps aux | sort -rn -k3 | head -n 10 #查看CPU占用最大的前10條數據
ps aux | sort -rn -k4 | head -n 10 #查看內存占用最大的前10條數據
ps 2881 #查看pid為2881的ps詳情
~~~
> 找到了問題的pid,即可進行強制關閉
> 有時候找出的問題進程是多個,就需要批量殺進程。可自行百度。
~~~
ps 2881
kill -9 2881 #關閉php-fpm,2881為pid
~~~
### netstat管理 [細節查詢]
> 用來打印Linux中網絡系統的狀態信息,可讓你得知整個Linux系統的網絡情況
~~~
netstat -anltp |grep :80 #假設(PID)為2881
~~~
> netstat找出DDOS攻擊并防御
~~~
netstat -anltp | grep ":80" | grep ESTABLISHED #找出最多鏈接的IP
iptables -A INPUT -s 221.238.196.83 -p tcp -j DROP #防火墻拒絕該IP
~~~
> 洪水攻擊的防范
??
### ddos / cc攻擊防范
~~~
top #1. 先看CPU以及內存情況,按P或M進行排序,如果占用高的進程是nginx
tail -f access.log #2. 實時查看是不是有人在ddos
~~~
### PING測試網絡
~~~
yum install iputils
ping www.99liwu.com
ping www.99liwu.com -t
~~~
### Crontab
~~~
vim /etc/crontab #編輯crontab文件
service crond status #查看crontab服務狀態
service crond start / stop / restart #手動操作crontab服務
chkconfig -–list crond #查看crontab的開機啟動情況
tail -f /var/log/cron # 查看日志
基本格式 :
* * * * * command
分 時 日 月 周 命令
第1列表示分鐘1~59 每分鐘用*或者 */1表示
第2列表示小時1~23(0表示0點)
第3列表示日期1~31
第4列表示月份1~12
第5列標識號星期0~6(0表示星期天)
第6列要運行的命令
crontab文件的一些例子:
30 1 * * * /usr/local/etc/rc.d/lighttpd restart
上面的例子表示每晚的1:30重啟apache。
0 */1 * * * /usr/local/etc/rc.d/lighttpd restart
每一小時重啟apache
*/1 * * * * /usr/local/etc/rc.d/lighttpd restart
每分鐘重啟apache
*/30 * * * * /usr/sbin/ntpdate 210.72.145.44
每半小時同步一下時間
~~~
繼續參考:
http://www.njxblog.com/2016/03/linux-shell%E5%8F%8A%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4%E7%AE%80%E4%BB%8B/