Linux命令收藏

一些linux的收藏

让cd不识别大小写

很多时候,你的目录开头是大写.这时候你cd到他的时候,就需要切到大写,如果可以不区分大小写多好呢..😆

bind "set completion-ignore-case on"

配置遇到的错误

[root@VM_0_11_centos ~]# systemctl status sshd.service
● sshd.service - OpenSSH server daemon
   Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)
   Active: failed (Result: exit-code) since 三 2018-03-07 08:50:52 CST; 18s ago
     Docs: man:sshd(8)
           man:sshd_config(5)
  Process: 30662 ExecStart=/usr/sbin/sshd -D $OPTIONS (code=exited, status=255)
 Main PID: 30662 (code=exited, status=255)

3月 07 08:50:52 VM_0_11_centos systemd[1]: Starting OpenSSH server daemon...
3月 07 08:50:52 VM_0_11_centos sshd[30662]: /etc/ssh/sshd_config line 154: unsupported option "inetClientAliveInterval".
3月 07 08:50:52 VM_0_11_centos systemd[1]: sshd.service: main process exited, code=exited, status=255/n/a
3月 07 08:50:52 VM_0_11_centos systemd[1]: Failed to start OpenSSH server daemon.
3月 07 08:50:52 VM_0_11_centos systemd[1]: Unit sshd.service entered failed state.
3月 07 08:50:52 VM_0_11_centos systemd[1]: sshd.service failed.

解决和排错办法

sshd -t
[root@VM_0_11_centos ~]# sshd -t
/etc/ssh/sshd_config line 154: unsupported option "inetClientAliveInterval".

这就很明显了,说没有inetClientAliveInterval这个配置

vi /etc/ssh/sshd_config
AddressFamily inetClientAliveInterval 60
ClientAliveCountMax 1

原来是echo的时候没有换行!!!

修改配置为
AddressFamily inet
ClientAliveInterval 60
ClientAliveCountMax 1
再次重启
service sshd restart
Redirecting to /bin/systemctl restart  sshd.service

解压.gz文件

这里演示一个nginx切割后的日志文件作为例子

gunzip -c access.log-20180222.gz > access.log-20180222.log

解压缩zip

安装zip和unzip

yum install zip -y
yum install unzip -y

压缩为zip文件

把2018-02-24-00-00-03文件夹压缩为ailuoy.zip,最终解压出来是2018-02-24-00-00-03文件夹

zip -q -r ailuoy 2018-02-24-00-00-03/

把2018-02-24-00-00-03文件夹里面的内容压缩为ailuoy.zip,同时压缩到/mnt/www/iluoy.com/storage/app/ailuoy目录下

cd 2018-02-24-00-00-03
zip -q -r /mnt/www/iluoy.com/storage/app/ailuoy/ailuoy *

解压zip

解压2018-02-24-00-00-03.zip到当前目录

unzip 2018-02-24-00-00-03.zip

解压2018-02-24-00-00-03.zip到path目录

unzip 2018-02-24-00-00-03.zip -d path

查看用户是否有某个文件夹的权限

sudo -u www stat /home/junjia/www/wanpi-back

无权限

➜  wanpi-back git:(dev-luoyang) ✗ sudo -u www stat /home/junjia/www/wanpi-back
stat: 无法获取"/home/junjia/www/wanpi-back" 的文件状态(stat): 权限不够

有权限

➜  wanpi-back git:(dev-luoyang) ✗ sudo -u www stat /mnt/www/iluoy.com
  文件:"/mnt/www/iluoy.com"
  大小:4096       块:8          IO 块:4096   目录
设备:fd01h/64769d Inode:1180274     硬链接:14
权限:(0755/drwxr-xr-x)  Uid:(    0/    root)   Gid:(    0/    root)
最近访问:2018-03-06 12:49:16.976407991 +0800
最近更改:2018-03-04 02:15:10.964330914 +0800
最近改动:2018-03-04 02:15:10.964330914 +0800
创建时间:-

软硬连接的建立/删除

建立软/硬连接

// 建立abc 的软连接,相当于在cde创建了一个abc的快捷方式
ln -s abc cde 
// 建立abc的硬连接
ln abc cde 

删除软/硬连接

// 注意不是rm -rf abc/
rm -rf abc 

tree命令(目录树)

安装

yum install tree -y

使用方法

tree(选项)(参数)

-a:显示所有文件和目录;
-A:使用ASNI绘图字符显示树状图而非以ASCII字符组合;
-C:在文件和目录清单加上色彩,便于区分各种类型;
-d:先是目录名称而非内容;
-D:列出文件或目录的更改时间;
-f:在每个文件或目录之前,显示完整的相对路径名称;
-F:在执行文件,目录,Socket,符号连接,管道名称名称,各自加上"*","/","@","|"号;
-g:列出文件或目录的所属群组名称,没有对应的名称时,则显示群组识别码;
-i:不以阶梯状列出文件和目录名称;
-l:<范本样式> 不显示符号范本样式的文件或目录名称;
-l:如遇到性质为符号连接的目录,直接列出该连接所指向的原始目录;
-n:不在文件和目录清单加上色彩;
-N:直接列出文件和目录名称,包括控制字符;
-p:列出权限标示;
-P:<范本样式> 只显示符合范本样式的文件和目录名称;
-q:用“?”号取代控制字符,列出文件和目录名称;
-s:列出文件和目录大小;
-t:用文件和目录的更改时间排序;
-u:列出文件或目录的拥有者名称,没有对应的名称时,则显示用户识别码;
-x:将范围局限在现行的文件系统中,若指定目录下的某些子目录,其存放于另一个文件系统上,则将该目录予以排除在寻找范围外。

示例

查看wanpi-back文件夹所有文件 深度1

tree -a wanpi-back -L 1
wanpi-back
├── app
├── artisan
├── bootstrap
├── composer.json
├── composer.lock
├── config
├── database
├── docs
├── .env
├── .env.example
├── .git
├── .gitattributes
├── .gitignore
├── .idea
├── _ide_helper.php
├── package.json
├── phpunit.xml
├── public
├── resources
├── routes
├── server.php
├── storage
├── tests
├── vendor
├── webpack.mix.js
└── yarn.lock

创建用户

useradd testuser  创建用户testuser
passwd testuser  给已创建的用户testuser设置密码
说明:新创建的用户会在/home下创建一个用户目录testuser
usermod --help  修改用户这个命令的相关参数
userdel testuser  删除用户testuser
rm -rf testuser  删除用户testuser所在目录
groupadd testuser 创建 testuser 组
useradd -g testuser testuser 创建testuser用户并加入testuser组

Linux下如何查看哪些进程占用的CPU内存资源最多

linux下获取占用CPU资源最多的10个进程,可以使用如下命令组合

ps aux|head -1;ps aux|grep -v PID|sort -rn -k +3|head

或者top (然后按下M,注意这里是大写)

linux下获取占用内存资源最多的10个进程,可以使用如下命令组合原文

ps aux|head -1;ps aux|grep -v PID|sort -rn -k +4|head
// 如果是10个进程,K=10,如果是最高的三个,K=3
ps -aux | sort -k4nr | head -K

或者top (然后按下P,注意这里是大写)

命令组合解析(针对CPU的,MEN也同样道理)

ps aux|head -1;ps aux|grep -v PID|sort -rn -k +3|head

该命令组合实际上是下面两句命令:

  • ps aux|head -1
  • ps aux|grep -v PID|sort -rn -k +3|head

其中第一句主要是为了获取标题(USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND)。 接下来的grep -v PID是将ps aux命令得到的标题去掉,即grep不包含PID这三个字母组合的行,再将其中结果使用sort排序。 sort -rn -k +3该命令中的-rn的r表示是结果倒序排列,n为以数值大小排序,而-k +3则是针对第3列的内容进行排序,再使用head命令获取默认前10行数据。(其中的|表示管道操作)

补充

  • PID:进程的ID
  • USER:进程所有者
  • PR:进程的优先级别,越小越优先被执行
  • NInice:值
  • VIRT:进程占用的虚拟内存
  • RES:进程占用的物理内存
  • SHR:进程使用的共享内存
  • S:进程的状态。S表示休眠,R表示正在运行,Z表示僵死状态,N表示该进程优先值为负数
  • %CPU:进程占用CPU的使用率
  • %MEM:进程使用的物理内存和总内存的百分比
  • TIME+:该进程启动后占用的总的CPU时间,即占用CPU使用时间的累加值。
  • COMMAND:进程启动命令名称

scp命令

Nginx Access Log日志统计分析常用命令

IP相关统计

统计IP访问量
awk '{print $1}' access.log | sort -n | uniq | wc -l
查看某一时间段的IP访问量(4-5点)
grep "07/Apr/2017:0[4-5]" access.log | awk '{print $1}' | sort | uniq -c| sort -nr | wc -l   
查看访问最频繁的前100个IP
awk '{print $1}' access.log | sort -n |uniq -c | sort -rn | head -n 100
查看访问100次以上的IP
awk '{print $1}' access.log | sort -n |uniq -c |awk '{if($1 >100) print $0}'|sort -rn
查询某个IP的详细访问情况,按访问频率排序
grep '104.217.108.66' access.log |awk '{print $7}'|sort |uniq -c |sort -rn |head -n 100   

页面访问统计

查看访问最频的页面(TOP100)
awk '{print $7}' access.log | sort |uniq -c | sort -rn | head -n 100
查看访问最频的页面([排除php页面】(TOP100)
grep -v ".php"  access.log | awk '{print $7}' | sort |uniq -c | sort -rn | head -n 100  
查看页面访问次数超过100次的页面
cat access.log | cut -d ' ' -f 7 | sort |uniq -c | awk '{if ($1 > 100) print $0}' | less
查看最近1000条记录,访问量最高的页面
tail -1000 access.log |awk '{print $7}'|sort|uniq -c|sort -nr|less

每秒请求量统计

统计每秒的请求数,top100的时间点(精确到秒)
awk '{print $4}' access.log |cut -c 14-21|sort|uniq -c|sort -nr|head -n 100

每分钟请求量统计

统计每分钟的请求数,top100的时间点(精确到分钟)
awk '{print $4}' access.log |cut -c 14-18|sort|uniq -c|sort -nr|head -n 100

每小时请求量统计

统计每小时的请求数,top100的时间点(精确到小时)
awk '{print $4}' access.log |cut -c 14-15|sort|uniq -c|sort -nr|head -n 100

性能分析

在nginx log中最后一个字段加入$request_time

列出传输时间超过 3 秒的页面,显示前20条
cat access.log|awk '($NF > 3){print $7}'|sort -n|uniq -c|sort -nr|head -20
列出php页面请求时间超过3秒的页面,并统计其出现的次数,显示前100条
cat access.log|awk '($NF > 1 &&  $7~/\.php/){print $7}'|sort -n|uniq -c|sort -nr|head -100

蜘蛛抓取统计

统计蜘蛛抓取次数
grep 'Baiduspider' access.log |wc -l
统计蜘蛛抓取404的次数
grep 'Baiduspider' access.log |grep '404' | wc -l

TCP连接统计

查看当前TCP连接数
netstat -tan | grep "ESTABLISHED" | grep ":80" | wc -l
用tcpdump嗅探80端口的访问看看谁最高
tcpdump -i eth0 -tnn dst port 80 -c 1000 | awk -F"." '{print $1"."$2"."$3"."$4}' | sort | uniq -c | sort -nr

批量杀死linux进程

突然有一次开了一个swoole_http,然后内存就满了...导致很多服务不能正常提供服务,这样的进程有很多,很多 一个个kill,根本kill不完

www      14524  0.0  0.4 467916 17956 ?        S    19:48   0:00 swoole_http_server: worker process for ailuoy
www      14525  0.0  0.4 467916 17956 ?        S    19:48   0:00 swoole_http_server: worker process for ailuoy
www      14526  0.0  0.4 550140 19032 ?        S    19:48   0:00 swoole_http_server: worker process for ailuoy
www      14527  0.0  0.4 550140 19032 ?        S    19:48   0:00 swoole_http_server: worker process for ailuoy
www      14528  0.0  0.4 550140 19032 ?        S    19:48   0:00 swoole_http_server: worker process for ailuoy
www      14529  0.0  0.4 550140 19032 ?        S    19:48   0:00 swoole_http_server: worker process for ailuoy
www      14537  0.0  0.4 539624 17952 ?        S    19:48   0:00 swoole_http_server: manager process for ailuoy
www      14543  0.0  0.4 467916 17956 ?        S    19:48   0:00 swoole_http_server: worker process for ailuoy
www      14544  0.0  0.4 467916 17956 ?        S    19:48   0:00 swoole_http_server: worker process for ailuoy
www      14545  0.0  0.4 467916 17956 ?        S    19:48   0:00 swoole_http_server: worker process for ailuoy
www      14546  0.0  0.4 467916 17956 ?        S    19:48   0:00 swoole_http_server: worker process for ailuoy
.......

批量kill

ps aux | grep swoole| grep -v grep|cut -c 9-15 | xargs kill -9

xargs命令

过滤查找

查找/data/logs/lequ/request目录下 request-2018-07-1*.log的日志包含 d74666dc4b5b69f153ad6cc63684486e和 collect-songs的日志行

find /data/logs/lequ/request -name "request-2018-07-1*.log" | xargs grep "d74666dc4b5b69f153ad6cc63684486e" | grep collect-songs

用户切换

  • sudo su 切换到root用户
  • su - server 切换到server用户

查看文件夹大小

  • du -sh 查看当前文件夹大小
  • du -sh * | sort -n 统计当前文件夹(目录)大小,并按文件大小排序
  • du -sk filename 查看指定文件大小
  • find /var/log/journal -type f | wc -l 查看文件夹中文件个数
  • ls -l |grep "^-"|wc -l 查看某文件夹下文件的个数,包括子文件夹里的
  • find ./company -type f | wc -l 查看某文件夹下文件的个数,包括子文件夹里的
  • du -h -d 1 . 查看文件夹大小

centos7 修改默认启动模式

新版本的CentOS 系统里使用’targets’ 取代了运行级别的概念。系统有两种默认的’targets’: 多用户.target 对应之前版本的3 运行级别; 而图形.target 对应之前的5运行级别。

查看默认的target,执行:

systemctl get-default

开机以命令模式启动

systemctl set-default multi-user.target

开机以图形界面启动

systemctl set-default graphical.target

参考文献

Linux下批量Kill多个进程

批量注释/反注释

批量注释

vim .env
# 进入选择模式
ctrl+v
# 按上下键选择行数
# 进入写入模式
shift+i
# 写入注释符号#
# 退出 esc

反注释

vim .env
# 进入选择模式
ctrl+v
# 按上下键选择行数
# 删除注释 按键位d

time

很多时候我们需要统计脚本的是跑了多少时间..如果又要输出大量日志的话..可能效果不是很理想

time php artisan command

用户加入组

我的php-fpm是用www用户在跑,所以项目的权限都是www用户的权限,junjia用户登录到服务器跑脚本,这时候权限就冲突了..

所以,这时候把junjia加入到www用户组即可

junjia加入到www用户组

usermod -a -G  www junjia

查看用户情况

$ id junjia
uid=1001(junjia) gid=1001(junjia) 组=1001(junjia),1000(www)

普通用户赋予sudo权限

vi /etc/sudoers
# 不需要输入密码
junjia ALL = (ALL) NOPASSWD: ALL

systemctl自动重启

curl 发送post 带json数据

curl -i -X POST \
-H 'Content-type':'application/json' \
-d '{"page":"0","token":"xxxx"}' \
"http://xxxxx.com/api/v1.0/song/list?appName=lequ&version=99&build=1.1&os=ios&channel=appstore"

ab压测post

ab -T 'application/json' -p postfile -c 4 -n 10000 'http://127.0.0.1:5200/api/v1.0/song/list?appName=lequ&version=99&build=1.1&os=ios&channel=appstore'

postfile

{"page":"0","token":"xxxxx"}

解决vim粘贴代码格式混乱的方法

在vim粘贴代码的时候,粘贴的代码(shift+insert)会自动缩进,导致格式非常混乱

方法一

在vim中,进入命令模式输入:set paste,在进行粘贴,就不会乱码了。但是这样存在一个问题,就是不会自动产生缩进了,因此需要在粘贴完成之后命了输入:set nopaste,恢复缩进模式。

方法二

在vimrc文件中添加set pastetoggle=<F9>,这样<F9>就成了改变paste模式的快捷键,日后再粘贴时,就可以使用<F9>进行切换了。是不是方便了很多。

挂载磁盘

查看磁盘

sudo su - root
fdisk -l

查看磁盘详情

fdisk /dev/vdb

Command (m for help): n
Partition type
   p   primary (0 primary, 0 extended, 4 free)
   e   extended (container for logical partitions)
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-209715199, default 2048):
Last sector, +sectors or +size{K,M,G,T,P} (2048-209715199, default 209715199):

Created a new partition 1 of type 'Linux' and of size 100 GiB.

Command (m for help): wq
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.

格式化硬盘

mkfs.ext4 /dev/vdb1

创建挂载目录

mkdir /data

编写挂载文件

vim /etc/fstab
/dev/vdb1                                 /data           ext4     defaults  0  0

挂载

mount -a

查看

df -h