Linux常用工具与命令

目录

Chapter 1 Chapter 2 Chapter 3 Chapter 4 Chapter 5
开发及调试 文件处理 性能分析 网络工具 其他
  • 开发及调试

    • 编辑器:vim
    • 编译器:gcc/g++
    • 调试工具:gdb
    • 查看依赖库:ldd
    • 二进制文件分析:objdump
    • ELF文件格式分析:readelf
    • 跟踪进程中系统调用:strace
    • 跟踪进程栈:pstack
    • 进程内存映射:pmap
  • 文件处理

    • 文件查找:find
    • 文本搜索:grep
    • 排序:sort
    • 转换:tr
    • 按列切分文本:cut
    • 按列拼接文本:paste
    • 统计行和字符:wc
    • 文本替换:sed
    • 数据流处理:awk
  • 性能分析

    • 进程查询:ps
    • 进程监控:top
    • 打开文件查询:lsof
    • 内存使用量:free
    • 监控性能指标:sar
  • 网络工具

    • 网卡配置:ifconfig
    • 查看当前网络连接:netstat
    • 查看路由表:route
    • 检查网络连通性:ping
    • 转发路径:traceroute
    • 网络Debug分析:nc
    • 命令行抓包:tcpdump
    • 域名解析工具:dig
    • 网络请求:curl
  • 其他

    • 终止进程:kill
    • 修改文件权限:chmod
    • 创建链接:ln
    • 显示文件尾:tail
    • 版本控制:git
    • 设置别名:alias

内容

开发及调试

开发工具大部分都提供了完善的功能,所以这里不一一列举用法。从技术层面来说,调试工具比开发工具更考验一个人的工程能力。

  1. 编辑器:vim

    • 服务器端开发必知必会,功能强大,这里不一一列举,但基本的打开文件、保存退出要会。
    • 详见
  2. 编译器:gcc/g++

    • C/C++编译器,必知必会,除此以外需要了解预处理-> 编译 -> 汇编 -> 链接等一系列流程。
    • 详见
  3. 调试工具:gdb

    • 服务器端调试必备。
    • 详见
  4. 查看依赖库:ldd

    • 程序依赖库查询
      1
      2
      3
      4
      5
      # ldd后接可执行文件
      # 第一列为程序依赖什么库,第二列为系统提供的与程序需要的库所对应的库,第三列为库加载的开始地址
      # 前两列可以判断系统提供的库和需要的库是否匹配,第三列可以知道当前库在进程地址空间中对应的开始位置

      ldd a.out
  5. 二进制文件分析:objdump

    • 反汇编,需要理解汇编语言
    • 详见
  6. ELF文件格式分析:readelf

    • 可以得到ELF文件各段内容,分析链接、符号表等需要用到
    • 详见
  7. 跟踪进程中系统调用:strace

  8. 跟踪进程栈:pstack

  9. 进程内存映射:pmap

    • 显示进程内存映射
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      # -x显示扩展信息,后接进程pid
      # Address: 内存开始地址
      # 显示信息:
      Kbytes: 占用内存的字节数
      RSS: 保留内存的字节数
      Dirty: 脏页的字节数(包括共享和私有的)
      Mode: 内存的权限:read、write、execute、shared、private
      Mapping: 占用内存的文件、或[anon](分配的内存)、或[stack](堆栈)
      Device: 设备名 (major:minor)

      pmap -x 12345

文件处理

Everything is file. 在Linux环境下,对文本处理相当频繁,所以有些命令的参数还是需要记忆的。另外其他很多命令的输出信息都需要通过文件处理命令来筛选有用信息。

  1. 文件查找:find

    按名查找:

    • 查找具体文件(一般方式)

      1
      find . -name *.cpp
    • 查找具体文件(正则方式)

      1
      2
      3
      # -regex为正则查找,-iregex为忽略大小写的正则查找 

      find -regex ".*.cpp$"

      定制查找:

    • 按类型查找

      1
      2
      3
      # f(file)为文件,d(dictionary)为目录,l(link)为链接

      find . -type f
    • 按时间查找

      1
      2
      3
      4
      # atime为访问时间,x天内加参数"-atime -x",超过x天加"-atime -x"
      # mtime为修改时间

      find . -type f -atime -7
    • 按大小查找

      1
      2
      3
      # -size后接文件大小,单位可以为k(kb),m(MB),g(GB)

      find . -type f -size -1k
    • 按权限查询

      1
      2
      3
      # -perm后接权限

      find . -type -perm 644
  2. 文本搜索:grep

    • 模式匹配

      1
      2
      3
      # 匹配test.cpp文件中含有"iostream"串的内容

      grep "iostream" test.cpp
    • 多个模式匹配

      1
      2
      3
      # 匹配test.cpp文件中含有"iostream""using"串的内容

      grep -e "using" -e "iostream" test.cpp
    • 输出信息

      1
      2
      3
      # -n为打印匹配的行号;-i搜索时忽略大小写;-c统计包含文本次数

      grep -n "iostream" test.cpp
  3. 排序:sort

    • 文件内容行排序
      1
      2
      3
      4
      5
      6
      # 排序在内存进行,不改变文件
      # -n(number)表示按数字排序,-d(dictionary)表示按字典序
      # -k N表示按各行第N列进行排序
      # -r(reverse)为逆序排序

      sort -n -k 1 test
  4. 转换:tr

    • 字符替换

      1
      2
      3
      4
      # 转换在内存进行,不改变文件
      # 将打开文件中所有目标字符替换

      cat test | tr '1' '2'
    • 字符删除

      1
      2
      3
      4
      # 转换在内存进行,不改变文件
      # -d删除(delete)

      cat test | tr -d '1'
    • 字符压缩

      1
      2
      3
      4
      # 转换在内存进行,不改变文件
      # -s位于后部

      cat test | tr ' ' -s
  5. 按列切分文本:cut

    • 截取特定列

      1
      2
      3
      4
      5
      # 截取的内存进行,不改变文件
      # -b(byte)以字节为单位,-c(character)以字符为单位,-f以字段为单位
      # 数字为具体列范围

      cut -f 1,2 test
    • 指定界定符

      1
      2
      3
      4
      # 截取的内存进行,不改变文件
      # -d后接界定符

      cut -f 2 -d ',' new
  6. 按列拼接文本:paste

    • 按列拼接

      1
      2
      3
      4
      5
      6
      # 在内存中拼接,不改变文件
      # 将两个文件按对应列拼接
      # 最后加上-d "x"会将x作为指定分隔符(paste test1 test2 -d ","
      # 两文件列数可以不同

      paste test1 test2
    • 指定界定符拼接

      1
      2
      3
      4
      # 在内存中拼接,不改变文件
      # 按照-d之后给出的界定符拼接

      paste test1 test2 -d ","
  7. 统计行和字符:wc

    • 基本统计
      1
      2
      3
      # -l统计行数(line),-w统计单词数(word),-c统计字符数(character)

      wc -l test
  8. 文本替换:sed

    • 区别于上面的命令,sed是可以直接改变被编辑文件内容的。
    • 详见
  9. 数据流处理:awk

    • 区别于上面的命令,awk是可以直接改变被编辑文件内容的。
    • 详见

系统信息

性能监视工具对于程序员的作用就像是听诊器对于医生的作用一样。系统信息主要针对于服务器性能较低时的排查工作,主要包括CPU信息,文件I/O和内存使用情况,通过进程为纽带得到系统运行的瓶颈。

  1. 进程查询:ps

    • 查看正在运行进程

      1
      2
      3
      # 常结合grep筛选信息(e.g, ps -ef | grep xxx)

      ps -ef
    • 以完整格式显示所有进程

      1
      2
      3
      # 常结合grep筛选信息

      ps -ajx
  2. 进程监控:top

    • 显示实时进程信息
      1
      2
      3
      4
      5
      6
      # 这是个大招,都不带参数的,具体信息通过grep筛选
      # 交互模式下键入M进程列表按内存使用大小降序排列,键入P进程列表按CPU使用大小降序排列
      # %id表示CPU空闲率,过低表示可能存在CPU存在瓶颈
      # %wa表示等待I/O的CPU时间百分比,过高则I/O存在瓶颈 > 用iostat进一步分析

      top
  3. 打开文件查询:lsof

    • 查看占用某端口的进程

      1
      2
      3
      4
      # 最常见的就是mysql端口被占用使用(lsof i:3307)
      # 周知端口(ftp:20/21, ssh:22, telnet:23, smtp:25, dns:53, http:80, pop3:110, https:443)

      lsof -i:53
      • 查看某用户打开的文件

        1
        2
        3
        # -u(user)为用户,后接用户名

        lsof -u inx
      • 查看指定进程打开的文件

        1
        2
        3
        4

        # -p(process)为进程,后接进程PID

        lsof -p 12345
      • 查看指定目录下被进程打开的文件

        1
        2
        3
        # 这里是"+d",需要注意,使用"+D"递归目录

        lsof +d /test
  4. 内存使用量:free

    • 内存使用量
      1
      2
      3
      # 可获得内存及交换区的总量,已使用量,空闲量等信息

      free
  5. 监控性能指标:sar

    监控CPU

    • 监控CPU负载

      1
      2
      3
      4
      # 加上-q可以查看运行队列中进程数,系统上进程大小,平均负载等
      # 这里"1"表示采样时间间隔是1秒,这里"2"表示采样次数为2

      sar -q 1 2
    • 监控CPU使用率

      1
      2
      3
      4
      # 可以显示CPU使用情况
      # 参数意义同上

      sar -u 1 2

      监控内存

    • 查询内存

      1
      2
      3
      4
      # 可以显示内存使用情况
      # 参数意义同上

      sar -r 1 2
    • 页面交换查询

      1
      2
      3
      4
       # 可以查看是否发生大量页面交换,吞吐率大幅下降时可用
      # 参数意义同上

      sar -W 1 2

网络工具

网络工具部分只介绍基本功能,参数部分一笔带过。这部分重点不在于工具的使用而是对反馈的数据进行解读,并且这部分命令功能的重合度还是比较高的。

  1. 网卡配置(链路层):ifconfig

    • 显示设备信息

      1
      2
      # 可以显示已激活的网络设备信息
      ifconfig
    • 启动关闭指定网卡

      1
      2
      3
      4
      # 前一个参数为具体网卡,后一个为开关信息
      # up为打开,down为关闭

      ifconfig eth0 up
    • 配置IP地址

      1
      2
      3
      # 前一个参数为具体网卡,后一个为配置的IP地址

      ifconfig eth0 192.168.1.1
    • 设置最大传输单元

      1
      2
      3
      前一个参数为具体网卡,后面为MTU的大小
      # 设置链路层MTU值,通常为1500
      ifconfig eth0 mtu 1500
    • 启用和关闭ARP协议

      1
      2
      3
      # 开启arp如下,若关闭则-arp

      ifconfig eth0 arp
  1. 查看当前网络连接(链路层/网络层/传输层):netstat

    • 网络接口信息

      1
      2
      3
      # 显示网卡信息,可结合ifconfig学习

      netstat -i
    • 列出端口

      1
      2
      3
      4
      # -a(all)表示所有端口,-t(tcp)表示所有使用中的TCP端口
      # -l(listening)表示正在监听的端口

      netstat -at
    • 显示端口统计信息

      1
      2
      3
      4
      # -s(status)显示各协议信息
      # -加上-t(tcp)显示tcp协议信息,加上-u(udp)显示udp协议信息

      netstat -s
    • 显示使用某协议的应用名

      1
      2
      3
      # -p(progress)表示程序,可以显示使用tcp/udp协议的应用的名称

      netstat -pt
    • 查找指定进程、端口

      1
      2
      3
      4
      5
      # 互逆操作第一个显示某程序使用的端口号,第二个显示某端口号的使用进程
      # 第二个操作可以用lsof替代

      netstat -ap | grep ssh
      netstat -an | grep ':80'
  2. 查看路由表(网络层IP协议):route

    • 查看路由信息
      1
      2
      3
      4
      # 得到路由表信息,具体分析路由表工作需要网络知识
      # 可以通过netstat -r(route)得到同样的路由表

      route
  3. 检查网络连通性(网络层ICMP协议):ping

    • 检查是否连通
      1
      2
      3
      4
      # 主要功能是检测网络连通性
      # 可以额外得到网站的ip地址和连接最大/最小/平均耗时。

      ping baidu.com
  4. 转发路径(网络层ICMP协议):traceroute

    • 文件包途径的IP

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
          # 
      # 可以打印从沿途经过的路由器IP地址

      traceroute baidu.com
      ```

      6. 网络Debug分析(网络层/传输层):nc
      - 端口扫描
      ```shell
      # 黑客很喜欢
      # 扫描某服务器端口使用情况
      # -v(view)显示指令执行过程,-w(wait)设置超时时长
      # -z使用输入输出模式(只在端口扫描时使用)
      # 数字为扫描的端口范围

      nc -v -w 1 baidu.com -z 75-1000
    • 其他详见

  5. 命令行抓包(网络层/传输层):tcpdump

    • 抓包利器,没有什么比数据更值得信赖。可以跟踪整个传输过程。
    • 详见
  6. 域名解析工具(应用层DNS协议):dig

    1
    2
    3
    4
    5
    # 应用层,DNS
    # 打印域名解析结果
    # 打印域名解析过程中涉及的各级DNS服务器地址

    dig baidu.com
  7. 网络请求(应用层):curl


其他

这里都是日常开发中高频命令。

  1. 终止进程:kill

    • 杀死具体进程

      1
      2
      3
      # 加具体进程PID

      kill 12345
    • 杀死某进程相关进程

      1
      2
      3
      # 加上"-9"杀死某进程相关进程

      kill -9 12345
  2. 修改文件权限:chmod

    • 更改文件权限
      1
      2
      3
      4
      5
      6
      7
      # 可以对三种使用者设置权限,u(user, owner),g(group),o(other)
      # 文件可以有三种权限,r(read),w(write),x(execute)
      # 这里u+r表示文件所有者在原有基础上增加文件读取权限
      # 这里777分别对应,u=7,g=7,o=7,具体数字含义自行google

      chmod u+r file
      chmod 777 file
  3. 创建链接:ln

    • 创建硬链接

      1
      2
      3
      # 文件inode中链接数会增加,只有链接数减为0时文件才真正被删除

      ln file1 file2
    • 创建软(符号链接)链接

      1
      2
      3
      4
      5
      # -s(symbol)为符号链接,仅仅是引用路径
      # 相比于硬链接最大特点是可以跨文件系统
      # 类似于Windows创建快捷方式,实际文件删除则链接失效

      ln -s file1 file2
  4. 显示文件尾:tail

    • 查看文件尾部
      1
      2
      3
      4
      # -f参数可以不立即回传结束信号,当文件有新写入数据时会及时更新
      # 查看日志时常用

      tail -f test
  5. 版本控制:git

    • 版本控制最好用的软件,没有之一。至少要知道”git init”,”git add”,”git commit”,”git pull”,”git push”几个命令。
    • 详见
  6. 设置别名:alias

    • 常用命令添加别名
      1
      2
      3
      # ".bashrc"文件中配置常用命令别名,生效后在命令行只需要使用别名即可代替原先很长的命令

      alias rm='rm -i'