> 更多常用命令可参考
> 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/