侧边栏壁纸
  • 累计撰写 251 篇文章
  • 累计创建 138 个标签
  • 累计收到 16 条评论

目 录CONTENT

文章目录

linux 常用命令杂记

Sherlock
2017-09-20 / 0 评论 / 0 点赞 / 1381 阅读 / 19049 字 / 编辑
温馨提示:
本文最后更新于 2024-03-20,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

其他文章:


Unix/Linux 命令速查表

可参考:学习linux命令,看这篇2w多字的命令详解就够了

文件删除后空间未释放

一般情况下不会出现删除文件后空间不释放的情况,但在这个文件被进程锁住或者是有进程一直往这个文件写数据等情况下,还是会出现的。

文件存在Linux系统中分为两部分:指针部分和数据部分。

  • 指针部分:存在文件系统的meta-data中,我们执行rm命令将数据删除后,这个指针就从meta-data中被清除掉了。
  • 数据部分:数据就是直接存储在磁盘上了,当指针被从meta-data中清除后,数据部分占用的空间就可以被覆盖并写入新的内容。

找到此类文件

# 通过lsof命令获取已经删除但是还被程序占用的文件列表
lsof | grep delete

如何释放此类空间

方法有很多种:重启占用的进程、重启操作系统、通过命令。
非生产环境采用前两种方式最方便了,但是对于生产环境,还是尽量采用命令的方式,命令如下:

## 覆写对应文件即可
echo " " > /xxx/xxx.log

通过这种方式,会释放掉占用的磁盘空间,也不影响进程继续执行

直接杀掉某一 Java 进程

ps -ef |grep java|grep xxx|awk 'NR==1 {print $2}'|xargs kill -9

# 或者

kill `ps -ef |grep java|grep xxx|awk '{print $2}'`

计算md5

计算字符串md5

echo -n TEXTCOLLBYfGiJUETHQ4hEcKSMd5zYpgqf1YRDhkmxHkhPWptrkoyz28wnI9V0aHeAuaKnak | md5
#faad49866e9498fc1719f5289e7a0269

echo -n TEXTCOLLBYfGiJUETHQ4hAcKSMd5zYpgqf1YRDhkmxHkhPWptrkoyz28wnI9V0aHeAuaKnak | md5
#faad49866e9498fc1719f5289e7a0269

## -n 是必须的,不打印换行符
## 巧的事这俩字符串只差了一个字母,但MD5碰撞了

计算文件md5

md5sum latest.yml

查看差异

diff 以逐行的方式,比较文本文件的异同处。如果指定要比较目录,则 diff 会比较目录中相同文件名的文件,但不会比较其中子目录。

diff latest.yml latest2.yml

直接在linux里面替换jar包里的某个文件

如果要替换的文件在jar包的二级及以下目录下,则需要以下步骤:

  • (1)使用jar tvf jar名称 | grep 目标文件名查询出目标文件在 war 包中的目录
  • (2)使用jar xvf jar名称 目标路径(copy上面查出的全路径)将目标文件及所在 war 包中的目录解压到当前路径
  • (3)修改目标文件的内容,或者将新的目标文件替换掉提取出来的目标文件
  • (4)使用jar uvf jar名称 目标文件路径和步骤(2)中的目标文件名相同)将新目标文件替换到 jar 包中

举例:假如需要替换 halo-latest.jar 下的 index.html 文件:

# 步骤1
jar tvf halo-latest.jar | grep index.html
# 步骤2
jar -xvf halo-latest.jar BOOT-INF/classes/admin/index.html
# 步骤3
vi BOOT-INF/classes/admin/index.html
# 步骤4
jar -uvf halo-latest.jar BOOT-INF/classes/admin/index.html

查看系统版本

uname -a
cat /proc/version 
cat /etc/issue 
lsb_release -a 
## RedHat, CentOS
# yum install redhat-lsb -y
## Ubuntu 
# apt-get install lsb-core -y

只适用于红帽系查看

cat /etc/redhat-release

查看进程的执行文件链接

ls -l /proc/{PID}/exe

查看当前系统各个进程打开了多少文件句柄

lsof -n | awk '{print $2}' | sort | uniq -c | sort -nr | more

查看最近的登录记录(是否被破解登录)

last

查看服务器内存占用

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
#开机启动这个服务
systemctl enable rc-local.service

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

查询/tmp目录下占用空间较大的文件

du -sh /tmp/*|sort -nr|head -3

强制复制

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 命令简介

更多了解可参考:Linux中国 使用 sed 命令查找和替换文件中的字符串的 16 个示例

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=/g' /data/mongo/27017/conf/27017.conf

替换时使用环境变量

例如:替换文件中的port: $PORT;为 PORT 变量值,假如是:8080

PORT=8080
sed -i 's/$PORT/'"$PORT"'/g' xxx.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

操作后需要重启操作系统

安装 sz/rz 命令行文件传输工具(上传/下载,在无ftp时很有用)

yum install -y lrzsz
0
  1. 支付宝打赏

    qrcode alipay
  2. 微信打赏

    qrcode weixin

评论区