linux 常用命令杂记

Unix/Linux 命令速查表

查看服务器内存占用

ps命令查看

# 使用ps命令找出占用内存资源最多的 20 个进程(数量可以任意设置)
ps aux | head -1;ps aux |grep -v PID |sort -rn -k +4 | head -20

ps -eo pmem,pcpu,rss,vsize,args | sort -k 1 -n -r | less  

查看进程占用的实际物理内存(与smem看到实际物理内存大小有出入,这里解释一下:SIZE: 进程使用的地址空间, 如果进程映射了100M的内存, 进程的地址空间将报告为100M内存. 事实上, 这个大小不是一个程序实际使用的内存数. 所以这里看到的内存跟smem看到的大小有出入)

ps -eo size,pid,user,command --sort -size | awk '{ hr=$1/1024 ; printf("%13.2f Mb ",hr) } { for ( x=4 ; x<=NF ; x++ ) { printf("%s ",$x) } print "" }' |cut -d "" -f2 | cut -d "-" -f1

ps aux | awk '{print $6/1024 " MB\t\t" $11}' | sort -n  

pmap 命令查看

pmap {PID}

# -x 显示扩展的信息
pmap -x {PID}  

统计当前文件夹下的文件个数、目录个数

# 统计当前文件夹下文件的个数,包括子文件夹里的
ls -lR|grep "^-"|wc -l

# 统计文件夹下目录的个数,包括子文件夹里的
ls -lR|grep "^d"|wc -l

# 统计当前文件夹下文件的个数
ls -l |grep "^-"|wc -l

# 统计当前文件夹下目录的个数
ls -l |grep "^d"|wc -l  

附:

统计输出信息的行数

wc -l  

将长列表输出信息过滤一部分,只保留一般文件,如果只保留目录就是 ^d

grep "^-"  

centos7 获取活动的网卡(已连接的)

ifconfig -a | grep 'RUNNING' | grep -v 'LOOPBACK'  
### 截取网卡id
ifconfig -a | grep 'RUNNING' | grep -v 'LOOPBACK' | cut -d : -f 1  

shell 生成 32 位 UUID

cat /proc/sys/kernel/random/uuid  
## 去掉 - 
cat /proc/sys/kernel/random/uuid | sed 's/-//g'  

操作系统优化

echo 'net.core.somaxconn = 262144  
net.ipv4.tcp_tw_recycle = 1  
net.ipv4.tcp_tw_reuse = 1  
net.ipv4.ip_local_port_range = 1024 65000' >> /etc/sysctl.conf  
## 使修改生效
/sbin/sysctl -p

echo '* soft nofile 65535  
* hard nofile 65535
* soft nproc 65535
* hard nproc 65535' >> /etc/security/limits.conf

修复centos7 默认修改 /etc/rc.d/rc.local 开机启动无效

chmod +x /etc/rc.d/rc.local  

nginx 报错 getpwnam("www") failed 修复

/usr/sbin/groupadd -f www
/usr/sbin/useradd -g www www

redis 启动 WARNING

### WARNING overcommit_memory is set to 0! Background save may fail under low memory condition.,解决办法
echo 'vm.overcommit_memory = 1' >> /etc/sysctl.conf  
sysctl vm.overcommit_memory=1  
### The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.,解决办法
echo 'net.core.somaxconn = 65535' >> /etc/sysctl.conf  
sysctl -p  
### you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. ,解决办法,关闭 Transparent Huge Pages (THP),必须在 redis 启动前设置
echo 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' >> /etc/rc.d/rc.local  
echo never > /sys/kernel/mm/transparent_hugepage/enabled  

查看 rc.local 自动启动日志

## 
cat /etc/rc.d/rc.local  
## 修改 #!/bin/sh 为 #!/bin/sh -x
## 重启系统
## 系统启动后就会把 /etc/rc.d/rc.local 里面的指令或脚本不能执行的日志写入 /var/log/messages
tail -f /var/log/messages  

刷新、装入已共享的动态链接库

# 通常在系统启动时运行,而当用户安装了一个新的动态链接库时,就需要手动运行这个命令
ldconfig  

查看动态库依赖

ldd ./ffmpeg  

递归创建多级目录

mkdir -p /opt/xx/yy/zz  

批量创建目录

在 opt 下创建 xx, yy, zz 目录

mkdir -p /opt/{xx,yy,zz}  

在 opt 下创建 dir0 - dir9 目录

mkdir -p /opt/dir{0..9}  

查询该目录所占空间大小

du -sh  

查询第一级子目录所占空间大小

du -h --max-depth=1  

强制复制

cp 命令默认是不会提示 overwrite? 的,但是 cp-i 选项会提示,而一般Linux的启动文件~/.bashrc 中会把 cp 命名成 alias cp='cp -i'
这样在Linux下输入 cp 命令实际上运行的是 cp -i,加上一个 \ 符号就是让此次的 cp 命令不使用别名 cp -i 运行。就不会有 overwrite? 的提示了。

\cp -R -f source target

顺便来总结一下 cp 的参数:

-a :相当于 -pdr 的意思;
-d :若来源文件为连结文件的属性(link file),则复制连结文件属性而非档案本身;
-f :为强制 (force) 的意思,若有重复或其它疑问时,不会询问使用者,而强制复制;
-i :若目的档(destination)已经存在时,在覆盖时会先询问是否真的动作!
-l :进行硬式连结 (hard link) 的连结档建立,而非复制档案本身;
-p :连同档案的属性一起复制过去,而非使用预设属性;
-r :递归持续复制,用于目录的复制行为;
-s :复制成为符号连结文件 (symbolic link),亦即『快捷方式』档案;
-u :若 destination 比 source 旧才更新 destination !
最后需要注意的,如果来源档有两个以上,则最后一个目的文件一定要是『目录』才行!

grep & sed 搜索超大文本文件

通常我们通过关键字找错误日志的时候,日志并不是每行都匹配,这样就会显示出部分日志,如下面搜索

cat catalina.out|grep -n IOException  

的结果:

250127:org.apache.catalina.connector.ClientAbortException: java.io.IOException: Broken pipe  
250187:Caused by: java.io.IOException: Broken pipe  

250127前面的行数缺少一部分导致无法查看具体错误日志,可以使用 sed 命令列出指定行范围内的日志:

sed -n '250100,250127p' catalina.out  

这样就可以把 250100 - 250127 的日志列出来。 还有以下用法:

显示匹配某个结果之后的3行,使用 -A 选项:

grep "5" -A 3 xxx.log  

显示匹配某个结果之前的3行,使用 -B 选项:

grep "5" -B 3 xxx.log  

显示匹配某个结果的前三行和后三行,使用 -C 选项:

grep "5" -C 3 xxx.log  

or 直接使用数字

grep "5" -3 xxx.log  

sed 命令简介

sed是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据行进行替换、删除、新增、选取等特定工作,下面先了解一下sed的用法:

sed [-nefri] 'command' 输入文本  

常用选项:

  • -n∶使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN的资料一般都会被列出到萤幕上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。
  • -e∶直接在指令列模式上进行 sed 的动作编辑;
  • -f∶直接将 sed 的动作写在一个档案内, -f filename 则可以执行 filename 内的sed 动作;
  • -r∶sed 的动作支援的是延伸型正规表示法的语法。(预设是基础正规表示法语法)
  • -i∶直接修改读取的档案内容,而不是由萤幕输出。

常用命令:

  • a ∶新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
  • c ∶取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
  • d ∶删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
  • i ∶插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
  • p ∶列印,亦即将某个选择的资料印出。通常 p 会与参数 sed -n 一起运作~
  • s ∶取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦!

例如: 替换文件中 replSet#replSet

sed -i 's/replSet=/#replSet=/' /data/mongo/27017/conf/27017.conf  

使用 sed 在某行的前一行或后一行添加内容

#匹配行前加
sed -i '/oldtxt/inewtxt' xxx.file  
#匹配行前后
sed -i '/oldtxt/anewtxt' xxx.file  

而在书写的时候为便与区分,往往会在i和a前面加一个反加一个反斜扛 。代码就变成了:

sed -i '/oldtxt/a\newtxt' xxx.txt  
sed -i '/oldtxt/i\newtxt' xxx.txt  

yum 清理缓存

rm -f /var/lib/rpm/__db*    # 删除/var/lib/rpm 目录下的__db开头的rpmdb文件  
rpm --rebuilddb             # rpm数据库重建  
yum clean all               # 清理所有yum缓存  
yum makecache               # 重新生成yum缓存  

※: 此解决法方法在RHEL/CentOS 5(未测试),6,7系列的操作系统中都是适用的.

yum "package is a duplicate with" 处理

列出重复的包

package-cleanup --dupes  

删除重复的包

package-cleanup --cleandupes  

linux网络对时命令

1.安装netdate

yum install ntpdate  

2.设置自己的时区

vi /etc/sysconfig/clock

## 设置为
ZONE="Asia/Shanghai"  

上面设置地区为上海,即+8区

3.执行命令,同步时间。

ntpdate asia.pool.ntp.org  

其中常见国家授时中心有:
微软公司授时主机(美国) time.windows.com
台警大授时中心(台湾) asia.pool.ntp.org
中科院授时中心(西安) 210.72.145.44
网通授时中心(北京) 219.158.14.130
4.定时同步时间
如果要让系统每天23:00去同步,这样可以使用上面命令设置为计划任务

crontab -e  

进入 crontab 编辑模式,使用方法同 vi,输入

0 23 * * * ntpdate asia.pool.ntp.org >> /var/log/ntpdate.log  

保存退出
这样就完成了你的系统到每天23:00asia.pool.ntp.org同步时间,并将同步的日志放到/var/log/ntpdate.log

系统时间设置

date -s 06/10/96  
## 可以直接设置系统时间为:1996年6月10日
date -s 13:12:00  
## 可以直接设置系统时间为:下午1点12分0秒

注意,这里说的是系统时间,是由 linux 操作系统维护的。
在系统启动时,Linux操作系统将时间从CMOS中读到系统时间变量中,以后修改时间通过修改系统时间实现。为了保持系统时间与CMOS时间的一致性,Linux每隔一段时间会将系统时间写入CMOS。由于该同步是每隔一段时间(大约是11分钟)进行的,在我们执行date -s后,如果马上重启机器,修改时间就有可能没有被写入CMOS,这就是问题的原因。如果要确保修改生效可以执行如下命令。

clock -w  

这个命令强制把系统时间写入CMOS。

日志定时清理

1、Linux删除文件命令:

find 对应目录 -mtime +天数 -name "文件名" -exec rm -rf {} \;  
说明:  
find:Linux查找命令,用户查找指定条件的文件  
/root/.pm2/logs/:需要进行清理的目标目录  
-mtime:标准语句写法  
+10 :数字代表天数  
-name "*.log.*":目标文件的类型,带有log的所有文件  
-exec:固定写法  
rm -rf:强制删除包括目录在内的文件  
{} \;:固定写法,一对大括号一个空格一个\一个; 

也可以使用以下方式清空日志文件:

cat /dev/null > /var/log/shadowsocks.log  

2、设置定时任务
每次都去手动执行任务太麻烦,我们可以新建一个shell脚本文件,再设置cron调度执行,让系统自动去清理相关的文件。

  • (1) 创建shell脚本(新建一个可执行文件auto_del_logs.sh,并分配可运行权限)
touch  /opt/bin/auto_del_logs.sh  
cd /opt/bin  
chmod +x auto_del_logs.sh  
  • (2) 编辑shell脚本
vi auto_del_logs.sh  

编辑auto_del_logs.sh文件如下(以清理pm2日志为例):
暂不需要 -mtime 参数。

#!/bin/sh  
find /root/.pm2/logs/ -mtime +10 -name "ghost-out*.log" -exec rm -rf {} \;  
  • (3) 执行定时任务 使用 crontab -e 命令添加任务即可。
## 每周日0点删除
0 0 * * 7 auto_del_logs.sh  

硬件检测

# 查看CPU信息(型号)
[root@localhost ~]# cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c
32  Intel(R) Xeon(R) CPU E5-2620 v4 @ 2.10GHz

# 查看物理CPU个数
[root@localhost ~]# cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l
2

# 查看每个物理CPU中core的个数(即核数)
[root@localhost ~]# cat /proc/cpuinfo| grep "cpu cores"| uniq
cpu cores    : 8

# 查看逻辑CPU的个数
[root@localhost ~]# cat /proc/cpuinfo| grep "processor"| wc -l
32

# 查看内存总数
[root@localhost ~]# cat /proc/meminfo | grep MemTotal
MemTotal:       32759216 kB

# 查看目录挂载情况
[root@localhost ~]# df -h
Filesystem      Size  Used Avail Use% Mounted on  
/dev/sda2        99G   11G   84G  12% /
tmpfs            16G     0   16G   0% /dev/shm  
/dev/sda1       194M   36M  149M  20% /boot
/dev/sdb        1.1T  199M  1.1T   1% /test
/dev/sdc        7.2T  179M  6.8T   1% /test1

# 查看硬盘情况
fdisk -l

# 获取有关硬件方面的信息(DMI数据库信息解码),包括BIOS、系统、主板、处理器、内存、缓存等等(可任务修改,不一定准确)
dmidecode  
# 只查询系统信息
dmidecode -t system  
# 只查询 BIOS 信息
dmidecode -t bios  
# 只查询 主板 信息
dmidecode -t 2  
# 查看当前内存数和插槽数
dmidecode|grep -P -A5 "Memory Device" |grep Size  
# dmidecode查看内存速率
dmidecode|grep -A16 "Memory Device"|grep 'Speed'  
# 查看服务器硬盘信息
cat /proc/scsi/scsi  

挂载新硬盘

# 查看当前磁盘设备信息:
fdisk -l  
# 例如发现了新磁盘 /dev/sdb,格式化/dev/sdb
mkfs.ext4 /dev/sda  
# 新建目录并挂载
mkdir /newdir  
mount /dev/sdb /newdir

# 检查是否挂载成功
df -h

# 设置开机时自动挂载,将信息写入fstab,让系统开启自动挂载
echo "/dev/sdb                /newdir                   ext4    defaults        0  0" >> /etc/fstab  
##OR
echo "UUID=xxx  /test  ext4    defaults 0 0" >> /etc/fstab  
# 磁盘 UUID 信息可以通过以下命令获取
blkid  

修复centos7 默认修改 /etc/rc.d/rc.local 开机启动无效

chmod +x /etc/rc.d/rc.local  

修复 Nginx 报 accept4() failed (24: Too many open files)

默认情况下linux文 件系统最大可打开文件数为1024。通过命令ulimit -a可以查看当前系统设置的最大句柄数是多少:

1.修改系统配置

echo '* soft nofile 65535  
* hard nofile 65535
* soft nproc 65535
* hard nproc 65535' >> /etc/security/limits.conf

保存并关闭,并重新载入sysctl命令,以使以上更改生效:

sysctl -p  

2.修改 Nginx 配置

追加或者编辑 nginx.conf

# Maximum open file descriptors per process;
# should be > worker_connections.
# It can't be used on windows.
worker_rlimit_nofile 65535;  
# 工作模式及每个进程连接数上限 
events {  
  use epoll;
  # When you need > 8000 * cpu_cores connections, you start optimizing your OS,
  # and this is probably the point at where you hire people who are smarter than
  # you, as this is *a lot* of requests.
  worker_connections 65535;
  # 所以nginx支持的总连接数就等于worker_processes * worker_connections
}

3.如果是 CentOS 7 还需要以下操作

echo "DefaultLimitNOFILE=65535  
DefaultLimitNPROC=65535" >> /etc/systemd/system.conf  

操作后需要重启操作系统