fd

1.所有进程允许打开的最大fd数量

cat /proc/sys/fs/file-max

2.所有进程已经打开的fd数量及允许的最大数量

/proc/sys/fs/file-nr

3.单个进程允许打开的最大fd数量

ulimit -n

4.单个进程(例如进程id为5454)已经打开的fd

ls -l /proc/5454/fd/

/proc/[pid]

cmdline

/proc/[pid]/cmdline 是一个只读文件,包含进程的完整命令行信息。如果该进程已经被交换出内存或者这个进程是 zombie 进程,则这个文件没有任何内容

exe

/proc/[pid]/exe 为实际运行程序的符号链接。举例如下:

$ ls -lt /proc/2406/exe
lrwxrwxrwx 1 root root 0 Dec 11 19:00 /proc/2406/exe -> /usr/bin/frps

fd

fd 是一个目录,包含进程打开文件的情况。举例如下:

$ ls -lt /proc/2406/fd

lrwx------ 1 root root 64 Dec 24 09:39 77 -> socket:[44377722]
lrwx------ 1 root root 64 Dec 17 15:07 47 -> socket:[29482617]
lr-x------ 1 root root 64 Dec 12 20:18 0 -> pipe:[13282]
l-wx------ 1 root root 64 Dec 12 20:18 1 -> pipe:[13283]
lrwx------ 1 root root 64 Dec 12 20:18 10 -> socket:[12238218]
lrwx------ 1 root root 64 Dec 12 20:18 4 -> anon_inode:[eventpoll]
lrwx------ 1 root root 64 Dec 12 20:18 40 -> socket:[19378614]

status

/proc/[pid]/status 包含进程的状态信息。其很多内容与 /proc/[pid]/stat 和 /proc/[pid]/statm 相同,但是却是以一种更清晰地方式展现出来。举例如下:

$ cat /proc/2406/status
Name:   frps
State:  S (sleeping)
Tgid:   2406
Ngid:   0
Pid:    2406
PPid:   2130
TracerPid:  0
Uid:    0   0   0   0
Gid:    0   0   0   0
FDSize: 128
Groups: 0
NStgid: 2406
NSpid:  2406
NSpgid: 2406
NSsid:  2130
VmPeak:    54880 kB
VmSize:    54880 kB
VmLck:         0 kB
VmPin:         0 kB
VmHWM:     34872 kB
VmRSS:     10468 kB
VmData:    47896 kB
VmStk:       132 kB
VmExe:      2984 kB
VmLib:         0 kB
VmPTE:        68 kB
VmPMD:        20 kB
VmSwap:        0 kB
HugetlbPages:          0 kB
Threads:    11
SigQ:   0/31834
SigPnd: 0000000000000000
ShdPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: 0000000000000000
SigCgt: fffffffe7fc1feff
CapInh: 0000000000000000
CapPrm: 0000003fffffffff
CapEff: 0000003fffffffff
CapBnd: 0000003fffffffff
CapAmb: 0000000000000000
Seccomp:    0
Cpus_allowed:   f
Cpus_allowed_list:  0-3
Mems_allowed:   00000000,00000001
Mems_allowed_list:  0
voluntary_ctxt_switches:    2251028
nonvoluntary_ctxt_switches: 18031

关于信号(signal)的信息:SigQ 分为两部分(例如 0/31834),前面表示当前处在队列中的信号(0),后面则表示队列一共可以存储多少信号(31834);SigPnd 表示当前线程 pending 的信号,而ShdPnd 则表示整个进程 pending 的信号;SigBlk、SigIgn 和 SigCgt 分别表示对信号的处理是阻塞,忽略,还是捕获。(关于Unix信号的相关知识,可以参考 Unix: Dealing with signals)。

  • Name: rsyslogd 解释:进程名

  • State: S (sleeping)

    • 解释:进程的状态我们前文已经做了很详细的分析,各进程的状态代表的意义如下:

      R (running)", “S (sleeping)”, “D (disk sleep)”, “T (stopped)”, “T(tracing stop)”, “Z (zombie)”, or “X (dead)”

  • Tgid: 987

    解释:Tgid是线程组的ID,一个线程一定属于一个线程组(进程组).

  • Pid: 987

    解释:这个是进程的ID,更准确的说应该是线程的ID.

  • PPid: 1

    解释:当前进程的父进程

  • TracerPid: 0

    解释:跟踪当前进程的进程ID,如果是0,表示没有跟踪.

  • Uid: 0 0 0 0

    Gid: 0 0 0 0

    解释:

    第一列数字(RUID):实际用户ID,指的是进程执行者是谁.

    第二列数字(EUID):有效用户ID,指进程执行时对文件的访问权限.

    第三列数字(SUID):保存设置用户ID,作为effective user ID的副本,在执行exec调用时后能重新恢复原来的effectiv user ID.

    第四列数字(FSUID):目前进程的文件系统的用户识别码.一般情况下,文件系统的用户识别码(fsuid)与有效的用户识别码(euid)是相同的.

    这里重点说明RUID和EUID,我们用test用户启动top,如下:

    终端1)

  • FDSize: 32

    解释:

    FDSize是当前分配的文件描述符,这个值不是当前进程使用文件描述符的上限.

    我们看到这里是32,但实际并没有分配32个文件

  • Groups: 0

    解释:

    这里的groups表示启动这个进程的用户所在的组.

  • VmPeak: 36528 kB

    解释:这里的VmPeak代表当前进程运行过程中占用内存的峰值.

    我们用下面的程序申请内存,然后释放内存,最后通pause()函数中止程序的运行,

  • VmSize: 36528 kB

    解释:VmSize代表进程现在正在占用的内存

  • VmLck: 0 kB

    解释:VmLck代表进程已经锁住的物理内存的大小.锁住的物理内存不能交换到硬盘.

  • VmHWM: 1432 kB

    VmRSS: 1420 kB

    解释:

    VmHWM是程序得到分配到物理内存的峰值.

    VmRSS是程序现在使用的物理内存.

  • VmPTE: 56 kB

    VmSwap: 0 kB

    VmPTE: 56 kB

    解释:

    占用的页表的大小.

    VmSwap: 0 kB

/proc/self

ssize_t readlink(const char *path, char *buf, size_t bufsiz);

/proc/self/exe 是一个符号链接,代表当前程序的绝对路径 用readlink读取/proc/self/exe可以获取当前程序的绝对路径

demsg

dmesg -Tx | grep 'Out of memory'
#查看是否有内存溢出

将动态库路径加入系统默认路径

(Linux中error while loading shared libraries错误解决办法)

  1. 首先打开/etc/ld.so.conf文件
  2. 加入动态库文件所在的目录:执行vi /etc/ld.so.conf,在"include ld.so.conf.d/*.conf"下方增加"/usr/local/lib"。
  3. 保存后,在命令行终端执行:/sbin/ldconfig -v;
    • 其作用是将文件/etc/ld.so.conf列出的路径下的库文件缓存到/etc/ld.so.cache以供使用,因此当安装完一些库文件,
    • 或者修改/etc/ld.so.conf增加了库的新搜索路径,需要运行一下ldconfig,使所有的库文件都被缓存到文件/etc/ld.so.cache中,如果没做,可能会找不到刚安装的库。

对某目录下所有文件内容进行匹配

grep "content" ./*