运维工具箱汇总

码农天地 -
运维工具箱汇总
概述

本篇主要汇集个人工作以来收集和整理的一些 Linux 运维工具, 用于排查、定位和处理各种问题,包括分析网络连接情况,找出消耗高内存的进程等

Shell 脚本工具双引号和单引号

单引号属于强引用,它会忽略所有被引起来的字符的特殊处理,被引用起来的字符会被原封不动的使用;

双引号属于弱引用,它会对一些被引起来的字符进行特殊处理,包括以下情况:

$加变量名可以取变量的值, 比如: $PWD反引号和$()引起来的字符会被当做命令执行后替换原来的字符, 比如 echo "$(echo hello world)"当需要使用字符($ " \)时必须进行转义,也就是在前面加 ;脚本完整路径返回全路径, 包括文件名: FILEPATH="$(readlink -f $0)"获取脚本所在目录路径: BASEDIR="$(dirname $(readlink -f $0))"环境变量设置变量, 只对当前进程有效: ENV=debug设置环境变量, 可以被子进程继承 : export ENV=debugSed & awk - 字符串文本操作替换文本: sed 's/原字符串/替换字符串/'

Sed 和 awk 使用外部变量:

x=MM sed 's/AB/'$x'/g' filename 或 sed 's/AB/'"$x"'/g' filename sed 's/'"$val"'//' filename awk '{ print "'$x'" }' filename a=2;b=3;awk -v A=$a -v B=$b 'BEGIN{printf("%d,%d\n",A,B);}'
浮点计算

使用 bc :

$ a=2;b=3;echo "scale=2; $a / $b" | bc .66 $ a=2;b=3;echo "scale=2; $a / $b" | bc -l .66

使用 awk:

$ a=2;b=3;awk 'BEGIN{printf("%.2f\n","'$a'"/"'$b'");}' 0.67
字符串操作

删除前尾空格:

line=" 123 " echo "A${line}B" line=`echo "$line" | xargs` echo "A${line}B"

大小写转换:

A="aBc" echo $A A="${A,,}" echo $A # 转换为小写
A="aBc" echo $A A="${A^^}" echo $A # 转换为大写

不区分大小写比较:

A1="ab" A2="Ab" shopt -s nocasematch [[ "$A1" = "$A2" ]];echo $? shopt -u nocasematch
# 或者以下
A1="ab" A2="Ab" test "${A1,,}" = "${A2,,}";echo $?
# 或者以下
A1="ab" A2="Ab" [[ "${A1,,}" = "${A2,,}" ]];echo $?

取字符串长度:

~> str="abcdef" ~> strlen=${#str} ~> echo $strlen 6

遍历字符串的每一个字符:

~> str="abcdef" ~> strlen=${#str} ~> echo $strlen 6 ~> for ((i=0; i<$strlen; ++i)) do echo ${str:$i:1}; done a b c d e f

判断字符串是否为数字:

str1="123abc" str2="123000" $(expr $str1 + 0 > /dev/null 2>&1) echo $? $(expr $str2 + 0 > /dev/null 2>&1) echo $?
查找操作

查找 关系:

ps aux|grep -E 'abc|xyz'

查找 关系:

ps aux|grep "abc.*xyz"
# 或者
ps aux | grep "abc" | grep "xyz"
查找进程查看所有正在运行的进程: ps aux列出所有正在运行的进程,包括完整的命令字符串: ps auxww搜索符合字符串的进程: ps aux | grep STRING以额外的完整格式列出当前用户的所有进程: ps --user $(id -u) -F以树状形式列出当前用户的所有进程: ps --user $(id -u) f获取一个进程的父节点 PID: ps -o ppid= -p pidawk

获取 IP 和端口号:

node="127.0.0.1:2019" eval $(echo "$node" | awk -F[\ \:,\;\t]+ '{ printf("ip=%s\nport=%s\n",$1,$2); }') echo $ip echo $port

获取指定网卡上的 IP 地址:

ethX=eth1 echo $ethX ip=`netstat -ie|awk -F'[ :]+' 'BEGIN{ok=0;} {if (match($0, "'$ethX'")) ok=1; if ((1ok) && match($0,"inet")) { ok=0; if (7NF) printf("%s\n",$3); else printf("%s\n",$4); } }'` echo $ip
滚动日志 logrotate

Linux 系统自带的日志滚动工具 logrotate 由两部分组成:一是命令行工具 logrotate,二是后台服务 rsyslogd

使用 rsyslogd,只需简单的配置即可实现日志滚动。rsyslogd的配置文件为 /etc/logrotate.conf ,但一般不建议直接修改logrotate.conf,而是在目录 /etc/logrotate.d 下新增文件的方式。

logrotate.conf 会 include 所有 logrotate.d 目录下的文件,语法是一致的,区别是 logrotate.conf 定义了默认的配置,而 logrotate.d 目录下为专有配置。

以下为配置日志滚动的 demo:

# cat /etc/logrotate.d/redis /usr/local/redis/log/redis-6379.log /usr/local/redis/log/redis-6380.log /usr/local/redis/log/redis-6381.log { rotate 2 minsize 100M nocompress missingok create 0664 redis redis notifempty }
设备类工具查看网卡型号: lspci | grep -i ethernet查看所有硬件信息: dmidecode查看 CPU: lscpu查看主板: lscpi查看 SCSI 卡: lsscsi系统类工具systemctl

系统管理

关机: systemctl poweroff重启: systemctl reboot进入单用户模式: systemctl rescue查看系统启动时间: systemd-analyze列出当前登录用户: loginctl list-users查看用户的 root 的状态: loginctl user-status root查看系统状态: systemctl status

单元管理:

查看服务单元: systemctl status mysql.service查看单元依赖: systemctl list-dependencies crond.servicejournalctl

systemd 出现之前,Linux 系统及各应用的日志都是分别管理的,systemd 开始统一管理了所有 Unit 的启动日志,这样可以只用一个journalctl 命令,查看所有内核和应用的日志

查看日志:

查看所有日志(包括内核和应用日志): journalctl仅查看内核日志, 以 JSON 格式输出, 且不按页输出: journalctl -k -o json --no-pager查看系统本次启动日志: journalctl -b查看日志占用的磁盘大小: jourctl --disk-usage

查看指定时间的日志:

journalctl --since "10 min ago" journalctl --since="2019-11-22 19:50:22" journalctl --since yesterday journalctl --since "2019-11-20" --until "2019-11-21 10:00"

查看指定进程日志:

journalctl _PID=`pidof crond`

查看指定用户日志:

journalctl _UID=`id -r -u root` --since today
重启服务

不同发行版本的 Linux, 重启方式可能有区别, 以 Nginx 为例:

service nginx restartsysctmctl restart nginx

其中 service 为老的重启服务方式,而 systemctl 是新的重启服务方式。service 是一个脚本,而 systemctl 是一个可执行程序。

Sar - 监控不同 Linux 子系统的性能

全称 System Activity Reporter,即系统活动情况报告,最为全面的系统性能分析工具之一,也可用来查看网络流量。

vmstat - 系统级内存监测工具

报告有关进程、内存、分页、块IO、陷阱、磁盘和CPU活动的信息。

显示虚拟内存统计数据: vmstat每2秒显示报告5次: vmstat 2 5iostat - 系统级磁盘IO监测工具显示自系统启动以来的CPU和磁盘统计报告: iostat显示CPU和磁盘统计报告,单位换算成兆字节: iostat -m显示设备 "sda "的磁盘名称的扩展磁盘统计: iostat -xN sdaiotop - 进程级磁盘IO监测工具mpstat - 报告CPU统计数据每2秒显示一次CPU统计数据: mpstat 2以2秒的时间间隔,从一个给定的处理器上逐一显示5份报告: mpstat -P 0 2 5查看系统中断

cat /proc/interrupts

查看网卡中断

grep eth0 /proc/interrupts |awk '{print $NF}'

查看中断亲和性

cat /proc/irq/74/smp_affinity # 以中断74为例

lsof - 列出打开的文件和相应的进程找到打开本地端口的进程: lsof -i :PORT查找打开给定文件的进程: lsof /path/to/file只输出进程 ID(PID): lsof -t /path/to/file列出指定用户打开的文件: lsof -u username列出由指定的命令或进程打开的文件: lsof -c process_or_command_name列出特定进程打开的文件,给定其 PID: lsof -p PID列出目录中打开的文件: lsof +D path/to/directory找到在本地TCP端口上监听的进程: lsof -iTCP:port -sTCP:LISTENfuser - 显示当前使用文件或套接字的进程 ID查看持有 TCP 2019端口的进程: fuser -v -n tcp 2019杀掉所有打开文件 /tmp/test 的进程: fuser -m -k /tmp/test 查看文件 /tmp/test 被那些进程打开: fuser -um /tmp/testfree - 显示系统中的空闲和已使用内存screen、byobu 和 tmux - 分屏工具dmesg - 将内核信息写入标准输出multitail - 类似 tai l的同时监控多个文档工具进程类工具pwdx - 打印进程的工作目录pidof - 查看进程 IDnice 和 ionice 优先级调整工具

nice 是进程的 CPU 优先级查看和调整工具,ionice 是进程的 IO 优先级查看和调整工具。

pstack - 查看调用栈性能类工具valgrind 和 qcachegrind 内存分析工具

开源的内存分析和性能分析工具。qcachegrind 是一个 valgrind 辅助工具,可视化方式查看 valgrind 性能分析结果。

perf - Linux 性能分析工具

Linux 自带的功能强大的性能分析工具,可结合火焰图。使用方式,如:perf top -p pid。自带了生成 SVG 格式的图形化工具timechart,也可结合 FlameGraph 生成火焰图。

记录进程一段时间性能统计信息: perf record -p pid -g -e event -o logfile perf report -i logfile

ab、 tsung、siege - 压力测试工具网络类工具netstat 和 ss

ss 是一个可以替代netstat的网络连接查看工具 (socket statistics)。

查看 TCP 监听: netstat -lpnt查看 TCP 连接: netstat -lpnaifconfig 和 ip设置一个 IP: ip addr add 192.168.31.13/24 dev eth1查看设置的 IP 是否生效: ip addr show eth1删除 IP: ip addr del 192.168.0.121/24 dev eth1查看路由表: ip route showtcpdump - 网络流量监听列出可用的网络接口: tcpdump -D捕获特定接口的流量: tcpdump -i eth0捕获所有TCP流量,在控制台显示内容(ASCII): tcpdump -A tcp捕捉来自或到达主机的流量: tcpdump host www.example.com捕获来自特定接口、源、目的和目的端口的流量: tcpdump -i eth0 src 192.168.1.1 and dst 192.168.1.2 and dst port 80捕捉网络的流量: tcpdump net 192.168.1.0/24捕获除端口22以外的所有流量,并保存到文件中: tcpdump -w dumpfile.pcap not port 22从文件中读取流量数据:tcpdump -r dumpfile.pcapiftop - 网络带宽监控socat - 多功能网络工具

全称 Socket CAT ,为 netcat 的加强版

/proc 文件系统/proc/meminfo: 内存大小和使用信息/proc/cpuinfo: CPU 个数和频率等信息

/proc/pid 和 /proc/PID/maps: 进程的各种信息,其中 PID 为进程 ID,假设进程 ID 为2019,则路径为“/proc/2019”。一个进程所创建和打开的文件描述符,全在 /proc/PID/fd 下,以 Linux 的 init 进程为例:

ls /proc/1/fd 0 1 10 11 12 13 14 15 16 17 2 20 21 22 24 25 26 27 28 29 3 30 31 32 33 34 37 38 39 4 5 6 7 8 9

/proc/irq

/proc/irq/ : 该目录下存放的是以 IRQ 号命名的目录,如 /proc/irq/40/ 表示中断号为40的相关信息/proc/irq/[irq_num]/smp_affinity : 该文件存放的是CPU位掩码(十六进制),修改该文件中的值可以改变CPU和某中断的亲和性/proc/irq/[irq_num]/smp_affinity_list : 该文件存放的是CPU列表(十进制),注意CPU核心个数用表示编号从0开始,如cpu0和cpu1等

/proc/net

/proc/net/dev : 统计网卡流量/proc/net/sockstat : SOCKET 的各类状态

/proc/sys/fs 文件系统相关

/proc/sys/fs/file-max/proc/sys/fs/file-nr/proc/sys/fs/inode-nr

/proc/sys/net : 网络相关

/proc/sys/net/core/somaxconn 控制TCP监听队列大小/proc/sys/net/ipv4/tcp_fin_timeout 控制 FIN_WAIT_2 状态的超时时长/proc/sys/net/ipv4/tcp_keepalive_intvl

/proc/sys/vm : 内存相关

/proc/sys/vm/drop_caches/proc/sys/vm/overcommit_memoryMISChistory - 命令行历史查看 Linux 各发行版本

cat /etc/*-release

获取机器 IP 地址
netstat -ie|awk /broadcast/'{print $2}' netstat -ie|awk -F '[ :]+' /cast/'{print $4}' netstat -ie|awk -F '[ :]+' /cast/'{print $3}'
清除系统缓存

echo 3 > /proc/sys/vm/drop_caches

查看 TCP 数据

cat /proc/net/tcp

查看 UDP 数据

cat /proc/net/udp

查看 socket 缓冲区默认大小

cat /proc/sys/net/core/rmem_default

查看 socket 缓冲区最大大小

cat /proc/sys/net/core/rmem_max

找出 CPU 占用最高的线程

ps -mp 20693 -o THREAD,tid,time | sort -rn

找出造成 IO 高负载的进程使用 iotop

使用工具 dmesg:

需要先开启内核 IO 的监控:

echo 1 >/proc/sys/vm/block_dump或sysctl vm.block_dump=1

使用如下命令, 查看 IO 高负载的 top10 进程:

dmesg |awk -F: '{print $1}'|sort|uniq -c|sort -rn|head -n 10

使用 iostat -x 1 确定高 IO 的进程:

# iostat -x 1 3 avg-cpu: %user %nice %system %iowait %steal %idle 1.06 0.00 0.99 1.09 0.00 97.85 Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util sda 0.49 17.29 1.74 6.75 23.47 200.18 11.73 100.09 26.33 0.10 12.25 5.73 4.87
配置 DNS 客户端

需要修改两个文件:

修改 /etc/resolv.conf: 增加 DNS 服务器的 IP 地址,格式为:nameserver DNS服务器IP地址, 可以有多行 nameserver修改 /etc/nsswitch.conf: 新增如下内容: hosts: files dns networks: files dns修改主机名临时修改: hostname NEW_HOST永久修改: 不同 Linux 发行版本, 对应的系统配置文件可能不同, 有些对应是 /etc/hostname, 配置里修改成: HOSTNAME=主机名, 修改完成后,需要重启网卡: /etc/rc.d/boot.localnet start 或者 service network restart
特别申明:本文内容来源网络,版权归原作者所有,如有侵权请立即与我们联系(cy198701067573@163.com),我们将及时处理。

Tags 标签

加个好友,技术交流

1628738909466805.jpg