查看进程

1
2
3
4
5
# -p: 同时显示每个进程的 PID
# -u: 同时列出每个进程所属账号名称
$ pstree -up

$ ps -aux

杀死进程

1
2
$ pgrep [进程名] # 等同于 ps aux | grep [进程名]
$ pkill [进程名] # 等同于 pgrep [进程名] | xargs kill -9

查看网络端口

netstat 是一款命令行工具,可用于列出系统上所有的网络套接字连接情况,包括 tcp, udp 以及 unix 套接字,另外它还能列出处于监听状态(即等待接入请求)的套接字,参考这篇文章

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
# netstat 参数
# -t 列出TCP协议的连接,-u 列出UDP协议的连接
# -n 禁用域名解析,只列出IP地址,可提升查找速度
# -l 列出正在监听的套接字
# -p 查看进程信息

# 列出正在监听中的连接
$ sudo netstat -lntp
$ netstat -lntp

# 打印 active 状态的连接
$ netstat -atnp | grep ESTA
(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
tcp        0      0 192.168.1.2:49156       173.255.230.5:80        ESTABLISHED 1691/chrome
tcp        0      0 192.168.1.2:33324       173.194.36.117:443      ESTABLISHED 1691/chrome

查看打开文件

lsof(list open files)是一个列出当前系统打开文件的工具。在 linux 环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。

1
2
3
4
5
6
7
$ lsof -i # 列出所有的网络的连接
$ lsof -i tcp # 列出所有TCP连接
$ lsof -i :3306 # 列出谁在使用某个端口
$ lsof -i udp:80 # 列出谁在使用某个特定的UDP端口
$ lsof -p 234 # 列出进程234打开的所有文件
$ lsof -u houmin #列出用户houmin打开的所有文件
$ lsof -c mysql # 列出所有以mysql这个进程开头的程序的文件

查看磁盘占用

top

top 命令是 Linux 下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
top - 16:27:05 up 157 days, 18:43,  6 users,  load average: 0.00, 0.00, 0.00
Tasks: 121 total,   2 running, 119 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.3 us,  0.0 sy,  0.0 ni, 99.7 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  2048028 total,   340732 free,   198124 used,  1509172 buff/cache
KiB Swap:        0 total,        0 free,        0 used.  1631636 avail Mem

  PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND
10109 root      10 -10  132768  17288  14768 S  0.3  0.8   8:55.79 AliYunDun
12503 houmin    20   0   42720  16312   2764 S  0.3  0.8   0:41.47 tmux
    1 root      20   0  119584   5224   3468 S  0.0  0.3   1:02.52 systemd
    2 root      20   0       0      0      0 S  0.0  0.0   0:00.02 kthreadd
    3 root      20   0       0      0      0 S  0.0  0.0   0:30.96 ksoftirqd/0
    5 root       0 -20       0      0      0 S  0.0  0.0   0:00.00 kworker/0:0H
    7 root      20   0       0      0      0 R  0.0  0.0  14:00.55 rcu_sched
    8 root      20   0       0      0      0 S  0.0  0.0   0:00.00 rcu_bh
    9 root      rt   0       0      0      0 S  0.0  0.0   0:00.00 migration/0
   10 root      rt   0       0      0      0 S  0.0  0.0   0:41.19 watchdog/0
   11 root      20   0       0      0      0 S  0.0  0.0   0:00.00 kdevtmpfs

关于 top 的显示的具体意义,可以参考 To be done

atop

atop 是一个功能非常强大的 linux 服务器监控工具,它的数据采集主要包括:CPU、内存、磁盘、网络、进程等,并且内容非常的详细,特别是当那一部分存在压力它会以特殊的颜色进行展示,如果颜色是红色那么说明已经非常严重了。

注意:所有的信息都是反映过去 10S 的状态信息

使用

atop 工具安装好后在运行命令 atop 就能弹出监控界面

img
img

接下来我们就来详细看看每行参数意义。

atop: 该行列出了服务器的 host、当前时间、信息收集的频率

PRC: 该列展示整个系统的性能状况;

  1. sys: 过去 10s 所有的进程在内核态运行的时间总和
  2. usr: 过去 10s 所有的进程在用户态的运行时间总和
  3. #proc: 进程总数
  4. #trun: 过去 10s 转换的进程数
  5. #zombie:过去 10s 僵死进程的数量
  6. #exit:在 10s 采样周期期间退出的进程数量

CPU: cpu 列展示了服务器的 CPU 整体的一个状态信息,包括内核和用户所占的比例、处理中断所占的比例、CPU 的处于空闲下比例(这里是 100%*cpu 核心数,CPU 有时候也会因为由于磁盘性能问题出现等待的空闲)

  1. sys: cpu 在处理进程时处于内核态的时间所占的比例
  2. usr: cpu 在处理进程时处于用户态的时间所占的比例
  3. irq: cpu 在处理进程的中断请求所占的实际比例
  4. idle: cpu 处于空闲状态下的时间比例(除了本身空闲,还有比如等待磁盘 io 的情况下也会处于空闲状态)

cpu: 每个核心的状态信息,和总的 CPU 信息一样,每列加起来的总和就是总的 CPU 的状态信息。

CPL: cpl 也反应了服务器整体的性能,展示信息包括进程等待队列数,分别从过去 1 分钟、5 分钟、15 分钟的采样信息。

  1. avg1: 过去 1 分钟进程等待队列数
  2. avg5: 过去 5 分钟进程等待队列数
  3. avg15: 过去 15 分钟进程等待队列数
  4. csw(context swapping):上下文交换次数
  5. intr(interrupt): 中断发生的次数
  6. numcpu: cpu 的核心数

mem: 该列主要展示内存的使用信息。

  1. tot:物理内存总量
  2. free:空闲内存的大小(不能单单从这个字段就判断内存不足,还需要参考 free -m 中的-/+ buffers/cache:free 因为这块的内容随时就可以拿过来使用,还可以从是否有使用 Swap 来判断是否内存不足)
  3. cache:用于页缓存的内存大小
  4. dirty:内存中的脏页大小
  5. buff:用于文件缓存的内存大小
  6. slab:系统内核占用的内存大小

SWP:交换空间使用情况

  1. tot: 交换空间总量
  2. free: 交换空间剩余空间总量

PAG 列:虚拟内存分页情况

  1. swin: 换入内存页数
  2. swout:换出内存页数

LVM/DSK: 每个分区信息以一列来进行展示

  1. busy:磁盘忙时所占比例
  2. read、KiB/r 、MBr/s:每秒读的请求数和请求的 kb、mb 数
  3. write、KiB/w 、MBr/w:每秒写的请求数和请求的 kb、mb 数
  4. avq:磁盘平均队列长度(根据实际的监控该列好像是磁盘平均请求数 avgrq)
  5. avio:磁盘的平均 io 时间

NET: 展示了传输层(TCP/UDP)、网络层(ip)、网络接口的网络传输信息。

**transport:**传输层(TCP/UDP)的数据输入输出的展示,例如在服务器的内部进程之间的数据传输就是在传输层展示,以为还不需要往下通过网络进行传输。

**network:**网络层(ip)的数据输入输出的展示;

**eth0:**默认的网络接口的数据输入输出的展示,也就是通过 etho 的 ip 的数据传输的展示,

  1. sp: 网卡的带宽(1000M)
  2. pcki:传入的数据包的大小
  3. pcko:传出的数据包的大小
  4. si:每秒传入的数据大小
  5. so:每秒传出的数据大小
  6. coll(collisions):每秒的冲突数
  7. mlti(MULTICAST):每秒的多路广播的数量
  8. erri/erro: 每秒输入输出的错误数
  9. drpi/drpo: 每秒的输入输出的丢包数

**lo:**通过 127.0.0.1 网络接口的数据传输的数据展示,参数和上面的 eth0 是一样的

进程列

进程列展示了每个进程在过去 10S 内的数据

m 模式:内存状态模式

SYSCPU:过去 10s 内进程处于内核模式占用的 CPU 时间

USRCPU:过去 10S 进程处于用户模式占用的 CPU 时间

VSIZE:过去 10S 进程占用的虚拟空间大小

RSIZE:过去 10S 进程占用的内存空间大小

PSIZE:过去 10S 进程占用的页大小

VGROW:过去 10S 进程增长的虚拟空间大小

RGROW:过去 10S 进程增长的内存大小

SWAPSZ:过去 10S 进程使用交换空间的大小。

MEM:过去 10S 进程占用内存百分比

d 模式:磁盘状态模式

RDDSK:过去 10S 进程读磁盘的数据量

WRDSK:过去 10S 进程写磁盘的数据量

DSK:过去 10S 进程所占磁盘的百分比

CMD:进程名

**p 模式:**进程状态模式,同一个名称的进程显示一列,根据进程名进行分组显示

NPROCS:相同名称的进程数量

其它的参数上面已经有列出

v 模式:线程状态模式

u 模式:用户模式

根据用户进行分组显示

g 模式:标准模式

s:进程当前的状态,包括:s(sleeping), R(runing)等

atop 的相关文件

/etc/atop:目录保存的是 atop 的配置文件 /etc/rc.d/init.d/atop:atop 的启动文件 /etc/cron.d/atop:atop 的定时任务文件,默认是每天 0 点开始 /var/log/atop:atop 日志文件,默认是每天 0 点开始会产生当天的一个日志文件,然后可以通过 atop -r file 查看信息,但是没有找到自动播放的的功能,只能通过输入 b 显示一个指定的时间的信息,可以写个循环来实现 /usr/bin/atop:atop 命令目录

atop -r atop_20160510 -b 13:00 -e 17:00

atop 产生的日志文件信息是 10 分钟一个采样周期进行记录,可以通过修改/etc/atop/atop.daily 文件进行修改。

atop 的其它参数:

Usage: atop [-flags] [interval [samples]]
        or
Usage: atop -w  file  [-S] [-a] [interval [samples]]
       atop -r [file] [-b hh:mm] [-e hh:mm] [-flags]

    generic flags:
      -a  show or log all processes (i.s.o. active processes only)
      -R  calculate proportional set size (PSS) per process
      -P  generate parseable output for specified label(s)
      -L  alternate line length (default 80) in case of non-screen output
      -f  show fixed number of lines with system statistics
      -F  suppress sorting of system resources
      -G  suppress exited processes in output
      -l  show limited number of lines for certain resources
      -y  show individual threads
      -1  show average-per-second i.s.o. total values

      -x  no colors in case of high occupation
      -g  show general process-info (default)
      -m  show memory-related process-info
      -d  show disk-related process-info
      -n  show network-related process-info
      -s  show scheduling-related process-info
      -v  show various process-info (ppid, user/group, date/time)
      -c  show command line per process
      -o  show own defined process-info
      -u  show cumulated process-info per user
      -p  show cumulated process-info per program (i.e. same name)

      -C  sort processes in order of cpu-consumption (default)
      -M  sort processes in order of memory-consumption
      -D  sort processes in order of disk-activity
      -N  sort processes in order of network-activity
      -A  sort processes in order of most active resource (auto mode)

    specific flags for raw logfiles:
      -w  write raw data to   file (compressed)
      -r  read  raw data from file (compressed)
          special file: y[y...] for yesterday (repeated)
      -S  finish atop automatically before midnight (i.s.o. #samples)
      -b  begin showing data from specified time
      -e  finish showing data after specified time

strace

strace 常用来跟踪进程执行时的系统调用和所接收的信号。 在 Linux 世界,进程不能直接访问硬件设备,当进程需要访问硬件设备(比如读取磁盘文件,接收网络数据等等)时,必须由用户态模式切换至内核态模式,通过系统调用访问硬件设备。strace 可以跟踪到一个进程产生的系统调用,包括参数,返回值,执行消耗的时间。

输出参数含义

每一行都是一条系统调用,等号左边是系统调用的函数名及其参数,右边是该调用的返回值。 strace 显示这些调用的参数并返回符号形式的值。strace 从内核接收信息,而且不需要以任何特殊的方式来构建内核。

1
2
3
4
5
6
7
$ strace cat /dev/null
execve("/bin/cat", ["cat", "/dev/null"], [/* 22 vars */]) = 0
brk(0)                                  = 0xab1000
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f29379a7000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
...

参数

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
-c 统计每一系统调用的所执行的时间,次数和出错的次数等.
-d 输出strace关于标准错误的调试信息.
-f 跟踪由fork调用所产生的子进程.
-ff 如果提供-o filename,则所有进程的跟踪结果输出到相应的filename.pid中,pid是各进程的进程号.
-F 尝试跟踪vfork调用.在-f时,vfork不被跟踪.
-h 输出简要的帮助信息.
-i 输出系统调用的入口指针.
-q 禁止输出关于脱离的消息.
-r 打印出相对时间关于,,每一个系统调用.
-t 在输出中的每一行前加上时间信息.
-tt 在输出中的每一行前加上时间信息,微秒级.
-ttt 微秒级输出,以秒了表示时间.
-T 显示每一调用所耗的时间.
-v 输出所有的系统调用.一些调用关于环境变量,状态,输入输出等调用由于使用频繁,默认不输出.
-V 输出strace的版本信息.
-x 以十六进制形式输出非标准字符串
-xx 所有字符串以十六进制形式输出.
-a column
设置返回值的输出位置.默认 为40.
-e expr
指定一个表达式,用来控制如何跟踪.格式如下:
[qualifier=][!]value1[,value2]...
qualifier只能是 trace,abbrev,verbose,raw,signal,read,write其中之一.value是用来限定的符号或数字.默认的 qualifier是 trace.感叹号是否定符号.例如:
-eopen等价于 -e trace=open,表示只跟踪open调用.而-etrace!=open表示跟踪除了open以外的其他调用.有两个特殊的符号 all 和 none.
注意有些shell使用!来执行历史记录里的命令,所以要使用\\.
-e trace=set
只跟踪指定的系统 调用.例如:-e trace=open,close,rean,write表示只跟踪这四个系统调用.默认的为set=all.
-e trace=file
只跟踪有关文件操作的系统调用.
-e trace=process
只跟踪有关进程控制的系统调用.
-e trace=network
跟踪与网络有关的所有系统调用.
-e strace=signal
跟踪所有与系统信号有关的 系统调用
-e trace=ipc
跟踪所有与进程通讯有关的系统调用
-e abbrev=set
设定 strace输出的系统调用的结果集.-v 等与 abbrev=none.默认为abbrev=all.
-e raw=set
将指 定的系统调用的参数以十六进制显示.
-e signal=set
指定跟踪的系统信号.默认为all.如 signal=!SIGIO(或者signal=!io),表示不跟踪SIGIO信号.
-e read=set
输出从指定文件中读出 的数据.例如:
-e read=3,5
-e write=set
输出写入到指定文件中的数据.
-o filename
将strace的输出写入文件filename
-p pid
跟踪指定的进程pid.
-s strsize
指定输出的字符串的最大长度.默认为32.文件名一直全部输出.
-u username
以username 的UID和GID执行被跟踪的命令

命令实例

跟踪可执行程序
1
$ strace -f -F -o ~/straceout.txt myserver

-f -F 选项告诉 strace 同时跟踪 fork 和 vfork 出来的进程,-o 选项把所有 strace 输出写到~/straceout.txt 里 面,myserver 是要启动和调试的程序。

跟踪服务程序
1
$ strace -o output.txt -T -tt -e trace=all -p 28979

跟踪 28979 进程的所有系统调用(— title: date: 2023-02-10 22:40:50 type: garden author: houmin tags: [] —-e trace=all),并统计系统调用的花费时间,以及开始时间(并以可视化的时分秒格式显示),最后将记录结果存在 output.txt 文件里面。

ptrack

pstack 是 Linux 系统下的一个命令行工具,此命令可以显示指定进程每个线程的堆栈快照,便于排查程序异常和性能评估

pstack 是基于 gdb 实现的,通过 man pstack 可以发现,它其实是 gstack 的一个软链接

pstack 可显示每个进程的栈跟踪。pstack 命令必须由相应进程的属主或 root 运行。可以使用 pstack 来确定进程挂起的位置。此命令允许使用的唯一选项是要检查的进程的 PID。请参见 proc(1) 手册页。

这个命令在排查进程问题时非常有用,比如我们发现一个服务一直处于 work 状态(如假死状态,好似死循环),使用这个命令就能轻松定位问题所在;可以在一段时间内,多执行几次 pstack,若发现代码栈总是停在同一个位置,那个位置就需要重点关注,很可能就是出问题的地方;

示例:查看 bash 程序进程栈:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
$ ps -fe | grep bash
tdev1   7013  7012  0 19:42 pts/1    00:00:00 -bash
tdev1  11402 11401  0 20:31 pts/2    00:00:00 -bash
tdev1  11474 11402  0 20:32 pts/2    00:00:00 grep bash
$ pstack 7013
#0  0x00000039958c5620 in __read_nocancel () from /lib64/libc.so.6
#1  0x000000000047dafe in rl_getc ()
#2  0x000000000047def6 in rl_read_key ()
#3  0x000000000046d0f5 in readline_internal_char ()
#4  0x000000000046d4e5 in readline ()
#5  0x00000000004213cf in ?? ()
#6  0x000000000041d685 in ?? ()
#7  0x000000000041e89e in ?? ()
#8  0x00000000004218dc in yyparse ()
#9  0x000000000041b507 in parse_command ()
#10 0x000000000041b5c6 in read_command ()
#11 0x000000000041b74e in reader_loop ()
#12 0x000000000041b2aa in main ()

vmstat

vmstat 是 Virtual Meomory Statistics(虚拟内存统计)的缩写,可对操作系统的虚拟内存、进程、CPU 活动进行监控。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# vmstat [-options] [delay] [count]
# 如果不写count,则会一直输出
vmstat 5 6
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 0  0      0 2455496 234152 4772420    0    0     2    16    4   85  1  0 99  0  0
 0  0      0 2454372 234152 4772420    0    0     0    66 1005 1825  0  1 99  0  0
 0  0      0 2454628 234156 4772424    0    0     0    15  967 1747  0  1 99  0  0
 0  0      0 2454040 234164 4772428    0    0     0    26 1030 1893  1  0 99  0  0
 0  0      0 2454224 234168 4772436    0    0     0    10  996 1794  1  0 99  0  0
 0  0      0 2454404 234168 4772436    0    0     0    10  958 1768  1  0 99  0  0

各个参数意义如下:

  • r 运行队列中进程的数量
  • b 等待 IO 的进程数量
  • swpd 使用虚拟内存大小
  • free 空闲的物理内存的大小
  • buff 用作缓冲的内存大小,指的是块设备 IO 时候在内存中的缓冲,一般来说不太重要
  • cache 用作缓存的内存大小,指的是文件读写时候的 page cache,比较重要
  • si 每秒从交换区写到内存的大小
  • so 每秒写入交换区的内存大小
  • bi 每秒从块设备读取的块数量,默认块大小是 1024byte,我本机上没什么 IO 操作,所以一直是 0,但是我曾在处理拷贝大量数据(2-3T)的机器上看过可以达到 140000/s,磁盘写入速度差不多 140M 每秒
  • bo 每秒写入到块设备的块数量
  • in 每秒 CPU 的中断次数,包括时间中断
  • cs 每秒上下文切换次数
  • us 用户 CPU 时间,包括 nice 时间
  • sy 系统 CPU 时间
  • id 空闲 CPU 时间,一般来说,id + us + sy = 100,一般我认为 id 是空闲 CPU 使用率,us 是用户 CPU 使用率,sy 是系统 CPU 使用率。
  • wa 等待 IO CPU 时间
  • st 虚拟机中运行的时间 stolen

iostat

iostat是 I/O statistics(输入/输出统计)的缩写,iostat 工具将对系统的磁盘操作活动进行监视。它的特点是汇报磁盘活动统计情况,同时也会汇报出 CPU 使用情况。iostat 属于 sysstat 软件包。可以用yum install sysstat 直接安装。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# iostat [-options] [interval] [count]
# iostat -x 表示输出详细信息
$ iostat -x 5
Linux 4.14.105-19-0012 (VM-1-28-centos) 	07/21/2020 	_x86_64_	(4 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.59    0.00    0.40    0.04    0.00   98.96

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
loop0             0.00     0.00    0.00    0.00     0.00     0.00    19.77     0.00    0.11    0.11    0.00   0.00   0.00
scd0              0.00     0.00    0.01    0.00     0.48     0.00    66.54     0.00    0.33    0.33    0.00   0.26   0.00
vda               0.00     2.27    0.90    2.36     9.37    61.83    43.65     0.03   13.44    1.72   17.92   0.16   0.05

各个参数意义如下

  • %user:CPU 处在用户模式下的时间百分比
  • %nice:CPU 处在带 NICE 值的用户模式下的时间百分比
  • %system:CPU 处在系统模式下的时间百分比
  • %iowait:CPU等待输入输出完成时间的百分比
  • %steal:管理程序维护另一个虚拟处理器时,虚拟CPU的无意识等待时间百分比
  • %idle:CPU空闲时间百分比

当然了,iostat命令的重点不是用来看 CPU 的,重点是用来监测磁盘性能的。

  • Device:设备名称
  • rrqm/s:每秒合并到设备的读取请求数
  • wrqm/s:每秒合并到设备的写请求数
  • r/s:每秒向磁盘发起的读操作数
  • w/s:每秒向磁盘发起的写操作数
  • rkB/s:每秒读 K 字节数
  • wkB/s:每秒写 K 字节数
  • avgrq-sz:平均每次设备 I/O 操作的数据大小
  • avgqu-sz:平均 I/O 队列长度
  • await:平均每次设备 I/O 操作的等待时间 (毫秒),一般地,系统 I/O 响应时间应该低于 5ms,如果大于 10ms 就比较大了
  • r_await:每个读操作平均所需的时间;不仅包括硬盘设备读操作的时间,还包括了在 kernel 队列中等待的时间
  • w_await:每个写操作平均所需的时间;不仅包括硬盘设备写操作的时间,还包括了在 kernel 队列中等待的时间
  • svctm:平均每次设备 I/O 操作的服务时间 (毫秒)(这个数据不可信!)
  • %util:一秒中有百分之多少的时间用于 I/O 操作,即被 IO 消耗的 CPU 百分比,一般地,如果该参数是 100%表示设备已经接近满负荷运行了

关于数据总结:

  • 如果 %util 接近 100%,说明产生的 I/O 请求太多,I/O 系统已经满负荷,该磁盘可能存在瓶颈

查看程序依赖库 ldd

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# ldd: list dynamic dependencies, 用于查看动态库的依赖关系
# ldd 常用来解决程式因缺少某个库文件而不能运行的一些问题。
$ ldd /bin/ls
	linux-vdso.so.1 =>  (0x00007ffe25deb000)
	libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007f8e79815000)
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f8e7944b000)
	libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f8e791db000)
	libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f8e78fd7000)
	/lib64/ld-linux-x86-64.so.2 (0x00007f8e79a37000)
	libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f8e78dba000)
# 第一列:程序需要依赖什么库
# 第二列: 系统提供的与程序需要的库所对应的库
# 第三列:库加载的开始地址
Info

原理: ldd 不是个可执行程式,而只是个 shell 脚本; ldd 显示可执行模块的 dependency 的工作原理,其实质是通过 ld-linux.so(elf 动态库的装载器)来实现的。ld-linux.so 模块会先于 executable 模块程式工作,并获得控制权,因此当上述的那些环境变量被设置时,ld-linux.so 选择了显示可执行模块的 dependency。

关于 ld-linux.so,可以参见我的另一篇文章