乐趣区

关于linux:运维工具箱汇总

概述

本篇次要会集集体工作以来收集和整顿的一些 Linux 运维工具,用于排查、定位和解决各种问题,包含剖析网络连接状况,找出耗费高内存的过程等

Shell 脚本工具

双引号和单引号

单引号属于强援用,它会疏忽所有被引起来的字符的非凡解决,被援用起来的字符会被一成不变的应用;

双引号属于弱援用,它会对一些被引起来的字符进行非凡解决,包含以下状况:

  • $ 加变量名能够取变量的值,比方:$PWD
  • 反引号和 $()引起来的字符会被当做命令执行后替换原来的字符, 比方 echo "$(echo hello world)"
  • 当须要应用字符 ($ " \) 时必须进行本义,也就是在后面加;

脚本残缺门路

  1. 返回全门路,包含文件名:FILEPATH="$(readlink -f $0)"
  2. 获取脚本所在目录门路:BASEDIR="$(dirname $(readlink -f $0))"

环境变量

  1. 设置变量,只对以后过程无效:ENV=debug
  2. 设置环境变量,能够被子过程 继承 : export ENV=debug

Sed & awk – 字符串文本操作

  1. 替换文本:sed 's/ 原字符串 / 替换字符串 /'
  2. 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);}'

浮点计算

  1. 应用 bc :

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

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

字符串操作

  1. 删除前尾空格:

    line="123" echo "A${line}B" line=`echo "$line" | xargs` echo "A${line}B"
  2. 大小写转换:

    A="aBc" echo $A A="${A,,}" echo $A # 转换为小写
    A="aBc" echo $A A="${A^^}" echo $A # 转换为大写
  3. 不辨别大小写比拟:

    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 $?
  4. 取字符串长度:

    ~> str="abcdef" ~> strlen=${#str} ~> echo $strlen 6
  5. 遍历字符串的每一个字符:

    ~> 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
  6. 判断字符串是否为数字:

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

查找操作

  1. 查找 关系:

    ps aux|grep -E 'abc|xyz'
  2. 查找 关系:

    ps aux|grep "abc.*xyz"
    # 或者
    ps aux | grep "abc" | grep "xyz"

查找过程

  1. 查看所有正在运行的过程:ps aux
  2. 列出所有正在运行的过程,包含残缺的命令字符串:ps auxww
  3. 搜寻合乎字符串的过程:ps aux | grep STRING
  4. 以额定的残缺格局列出以后用户的所有过程: ps --user $(id -u) -F
  5. 以树状模式列出以后用户的所有过程: ps --user $(id -u) f
  6. 获取一个过程的父节点 PID: ps -o ppid= -p pid

awk

  • 获取 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

  1. 系统管理

    • 关机:systemctl poweroff
    • 重启:systemctl reboot
    • 进入单用户模式: systemctl rescue
    • 查看系统启动工夫:systemd-analyze
    • 列出以后登录用户:loginctl list-users
    • 查看用户的 root 的状态:loginctl user-status root
  2. 查看零碎状态:systemctl status
  3. 单元治理:

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

journalctl

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 为例:

  1. service nginx restart
  2. sysctmctl restart nginx

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

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

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

vmstat – 零碎级内存监测工具

报告无关过程、内存、分页、块 IO、陷阱、磁盘和 CPU 流动的信息。

  1. 显示虚拟内存统计数据:vmstat
  2. 每 2 秒显示报告 5 次: vmstat 2 5

iostat – 零碎级磁盘 IO 监测工具

  1. 显示自系统启动以来的 CPU 和磁盘统计报告: iostat
  2. 显示 CPU 和磁盘统计报告,单位换算成兆字节: iostat -m
  3. 显示设施 “sda “ 的磁盘名称的扩大磁盘统计: iostat -xN sda

iotop – 过程级磁盘 IO 监测工具

mpstat – 报告 CPU 统计数据

  1. 每 2 秒显示一次 CPU 统计数据: mpstat 2
  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 – 列出关上的文件和相应的过程

  1. 找到关上本地端口的过程:lsof -i :PORT
  2. 查找关上给定文件的过程: lsof /path/to/file
  3. 只输入过程 ID(PID):lsof -t /path/to/file
  4. 列出指定用户关上的文件: lsof -u username
  5. 列出由指定的命令或过程关上的文件: lsof -c process_or_command_name
  6. 列出特定过程关上的文件,给定其 PID: lsof -p PID
  7. 列出目录中关上的文件: lsof +D path/to/directory
  8. 找到在本地 TCP 端口上监听的过程: lsof -iTCP:port -sTCP:LISTEN

fuser – 显示以后应用文件或套接字的过程 ID

  1. 查看持有 TCP 2019 端口的过程:fuser -v -n tcp 2019
  2. 杀掉所有关上文件 /tmp/test 的过程:fuser -m -k /tmp/test
  3. 查看文件 /tmp/test 被那些过程关上:fuser -um /tmp/test

free – 显示零碎中的闲暇和已应用内存

screen、byobu 和 tmux – 分屏工具

dmesg – 将内核信息写入规范输入

multitail – 相似 tai l 的同时监控多个文档工具

过程类工具

pwdx – 打印过程的工作目录

pidof – 查看过程 ID

nice 和 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)。

  1. 查看 TCP 监听:netstat -lpnt
  2. 查看 TCP 连贯:netstat -lpna

ifconfig 和 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 show

tcpdump – 网络流量监听

  • 列出可用的网络接口: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.pcap

iftop – 网络带宽监控

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

    1. /proc/irq/ : 该目录下寄存的是以 IRQ 号命名的目录,如 /proc/irq/40/ 示意中断号为 40 的相干信息
    2. /proc/irq/[irq_num]/smp_affinity : 该文件寄存的是 CPU 位掩码(十六进制),批改该文件中的值能够扭转 CPU 和某中断的亲和性
    3. /proc/irq/[irq_num]/smp_affinity_list : 该文件寄存的是 CPU 列表(十进制),留神 CPU 外围个数用示意编号从 0 开始,如 cpu0 和 cpu1 等
  • /proc/net

    1. /proc/net/dev : 统计网卡流量
    2. /proc/net/sockstat : SOCKET 的各类状态
  • /proc/sys/fs 文件系统相干

    1. /proc/sys/fs/file-max
    2. /proc/sys/fs/file-nr
    3. /proc/sys/fs/inode-nr
  • /proc/sys/net : 网络相干

    1. /proc/sys/net/core/somaxconn 管制 TCP 监听队列大小
    2. /proc/sys/net/ipv4/tcp_fin_timeout 管制 FIN_WAIT_2 状态的超时时长
    3. /proc/sys/net/ipv4/tcp_keepalive_intvl
  • /proc/sys/vm : 内存相干

    1. /proc/sys/vm/drop_caches
    2. /proc/sys/vm/overcommit_memory

MISC

history – 命令行历史

查看 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 高负载的过程

  1. 应用 iotop
  2. 应用工具 dmesg:

    1. 须要先开启内核 IO 的监控:

      echo 1 >/proc/sys/vm/block_dump 或 sysctl vm.block_dump=1
    2. 应用如下命令, 查看 IO 高负载的 top10 过程:

      dmesg |awk -F: '{print $1}'|sort|uniq -c|sort -rn|head -n 10
    3. 应用 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 客户端

须要批改两个文件:

  1. 批改 /etc/resolv.conf: 减少 DNS 服务器的 IP 地址,格局为:nameserver DNS 服务器 IP 地址, 能够有多行 nameserver
  2. 批改 /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
退出移动版