通过/proc查看Unix系统上的进程

/proc文件系统以一些非常有用的方式使您的Unix系统上的进程进入视图,但只有在您花时间cd到/proc并查看它能告诉您的所有信息的情况下才行。

proc虚拟文件系统已经在Unix系统上使用了20年了。

我想它是1996年在Solaris上出现的。

提供对以前仅在Unix内核或通过中可用的信息的访问

proc是一组特殊的命令,它使访问和使用关于系统和正在运行的进程的信息变得更加容易。尽管如此,/proc的某些方面很容易理解,而另一些方面则很难理解。

proc文件系统本身就是一个虚拟文件系统。这些文件不是“真正的”文件

我们习惯于与inode相关联,并在磁盘上为它们分配空间。

如果您查看/proc中的文件,首先注意到的一件事是文件和

所有目录的大小都显示为0。

$ cd / proc $ ls - l 0 dr-xr-xr-x 6根总根0 1 7月28日13:39 dr-xr-xr-x 6根根0 7月28日13:39 10 dr-xr-xr-x 6根根0 1020年7月28日13:39 dr-xr-xr-x 6根根0 7月28日13:39 11 dr-xr-xr-x 6根根0 111年7月28日13:39……-r-------- 1 root root 0 Aug 17 14:02 vmcore -r——r——r——1 root root 0 Aug 17 14:02 vmstat -r——r——r——1 root root 0 Aug 17 14:02 zoneinfo . txt . txt

这些“空”目录和文件提供了对我们的过程的视图,这是很难通过其他方法获得的。

当你cd到/proc并列出它的内容时,你会注意到许多目录

拥有简单的数字名称。每一个都对应于系统上当前运行的进程。计算具有数字名称的文件和正在运行的进程数,我们应该得到相同的结果,或者非常接近的结果(您使用的命令将在两个列表中)。

$ CD /proc $ ls | grep '[0-9]' | wc -l 164 $ ps -ef | wc -l 164

要查看/proc了解进程的示例,请从ps -ef输出中选择一个进程,然后移动到相应的/proc目录。

$ ps -ef | grep httpd root 2278 1 0 7月23日?00:00:01 /usr/sbin/httpd apache 3770 2278 0 04:02 ?00:00:00 /usr/sbin/httpd apache 3771 2278 0 04:02 ?00:00:00 /usr/sbin/httpd apache 3772 2278 0 04:02 ?00:00:00 /usr/sbin/httpd apache 3773 2278 0 04:02 ?00:00:00 /usr/sbin/httpd apache 3774 2278 0 04:02 ?00:00:00 /usr/sbin/httpd apache 3775 2278 0 04:02 ?00:00:00 /usr/sbin/httpd apache 3776 2278 0 04:02 ?00:00:00 /usr/sbin/httpd apache 3777 2278 0 04:02 ?00:00:00 /usr/sbin/httpd $ ls: cannot read symbolic link /proc/2278/cwd: Permission denied ls: cannot read symbolic link /proc/2278/root: Permission denied ls: cannot read symbolic link /proc/2278/exe: Permission denied attr cpuset fd loginuid mountstats schedstat status auxv cwd fdinfo maps oom_adj smaps task cmdline environ io mem oom_score stat wchan coredump_filter exe limits mounts root statm

使用您的个人凭证,您无法查看/proc中的所有文件(如上所示),但使用sudo或切换到根目录,您可以查看任何进程的任何文件。

当然,2278目录只是众多目录中的一个。

$ ls / proc 1 1607 199 2462 2844 31293 516设备挂载十17 2 2478 2899 31294 6 diskstats mtrr 1020 29 1772 201 2479 31295 6428 dma净11 18 202 2486 2900 31298 6430司机分区111 1836 203 2491 2929 359 6486 execdomains schedstat 112 1842 204 2497 2932 3770 6642 fb scsi 25 113 1843 205 2933 3771 7文件系统自114 1844 2154 25062934 3772 7730 fs slabinfo 117 1845 2156 2559 2935 3773 7838 ide统计119 1863 2186 2580 2936 3774 7966中断掉期12 1881 2189 2585 2938 3775 7970 iomem sys 13 1882 2240 26 2961 3776 7972 ioports sysrq-trigger 14 1883 2241 2602 2963 3777 8 irq sysvipc 15 4 8006 kallsyms tty 15393 1888 2242 2615 1895 2243 2631 31261 406 8008 kcore正常运行时间1567 1896 2265 2647 1568 1898 2278 31264 412 8009键版本27 31268 413 8059关键用户vmcore 1570 1899 2312 2704 31271 414 9 kmsg vmstat 1571 19 2313 2716 31272 415 acpi loadavg zoneinfo 1572 1907 2314 2719 31274 416 buddyinfo锁16 1927 2315 2746 31285 437总线mdstat 1601 1933 2361 2765 31287 458 cmdline meminfo 1603 1934 2391 2775 31288483 cpuinfo misc 1605 198 2440 28 31289 5 crypto模块

假设您想了解/proc可以告诉您关于登录shell的什么信息。您可能要做的第一件事是显示shell的进程ID。

$ echo $ 8009

让我们看看它在/proc中的表示。首先,这里是目录:

$ cd /proc $ ls -ld 8009 dr-xr-xr-x 6 shs staff 0 Aug 17 12:31 8009

如果我们移动到该目录中,我们可以看到提供有关进程的一些信息的所有文件。请注意,这些文件中的大多数都为系统上的任何人提供了读访问权限。还要注意,它们都有相同的创建日期和时间——当您登录时。

ls - l cd 8009美元总0 dr-xr-xr-x 2合成人员0 8月17日12:52 attr - r - 1合成人员0 8月17日12:52 auxv - r - r - r - 1合成人员0 8月17日12:52 cmdline -rw-r - r - 1合成人员0 8月17日12:52 coredump_filter - r - r - r - 1合成人员0 8月17日12:52 cpuset lrwxrwxrwx 1合成人员0 8月17日12:52慢性消耗病- > /proc/8009 - r - 1合成人员0 8月17日12:52environ lrwxrwxrwx 1 shs staff 0 Aug 17 12:52 exe -> /bin/bash dr-x------ 2 shs staff 0 Aug 17 12:52 fd dr-x------ 2 shs staff 0 Aug 17 12:52 fdinfo -r-------- 1 shs staff 0 Aug 17 12:52 io -r--r--r-- 1 shs staff 0 Aug 17 12:52 limits -rw-r--r-- 1 shs staff 0 Aug 17 12:52 loginuid -r--r--r-- 1 shs staff 0 Aug 17 12:52 maps -rw------- 1 shs staff 0 Aug 17 12:52 mem -r--r--r-- 1 shs staff 0 Aug 17 12:52 mounts -r-------- 1 shs staff 0 Aug 17 12:52 mountstats -rw-r--r-- 1 shs staff 0 Aug 17 12:52 oom_adj -r--r--r-- 1 shs staff 0 Aug 17 12:52 oom_score lrwxrwxrwx 1 shs staff 0 Aug 17 12:52 root -> / -r--r--r-- 1 shs staff 0 Aug 17 12:52 schedstat -r--r--r-- 1 shs staff 0 Aug 17 12:52 smaps -r--r--r-- 1 shs staff 0 Aug 17 12:52 stat -r--r--r-- 1 shs staff 0 Aug 17 12:52 statm -r--r--r-- 1 shs staff 0 Aug 17 12:52 status dr-xr-xr-x 3 shs staff 0 Aug 17 12:52 task -r--r--r-- 1 shs staff 0 Aug 17 12:52 wchan

其中一些文件很容易使用。其他的则需要更多的努力。stat文件提供了关于进程状态的信息,但表示信息的格式如下:

$ cat stat 8009 (bash) S 8008 8009 8009 34816 9706 4194304 5516 51685 0 168 37 47 15 0 10 1831964390 4898816 370 4294967295 134508544 135222164 3215953072 32159551 908

状态文件更容易使用。它提供了与stat相同的信息,但格式更友好。

猫美元地位的名字:bash状态:年代(睡觉)SleepAVG: 98% Tgid: 8009 Pid: 8009 PPid: 8008 TracerPid: 0 Uid: 263 263 263 263 Gid: 100 100 100 100 FDSize: 256组:100 VmPeak: 4784 kB VmSize: 4784 kB VmLck: 0 kB VmHWM: 1476 kB VmRSS: 1476 kB VmData: 316 kB VmStk: 88 kB VmExe: 700 kB VmLib: 1544 kB VmPTE: 28 kB StaBrk: 08851000 kB Brk:08893000 kB StaStk: bfaf8cb0 kB ExecLim: 080f6000 Threads: 1 SigQ: 0/32375 SigPnd: 0000000000000000 ShdPnd: 0000000000000000 SigBlk: 0000000000010000 SigIgn: 0000000000384004 SigCgt: 000000004b813efb CapInh: 0000000000000000 CapPrm: 0000000000000000 CapEff: 0000000000000000 Cpus_allowed: 0000000000000000 Mems_allowed: 1

其中一些信息非常简单——进程名(bash)、进程ID和父进程ID。您应该能够轻松地选择UID和GID。

我们的进程正在休眠,这应该不足为奇。在任何时候,大多数进程都处于休眠状态,尽管我们在运行此命令时显然使用了shell,但我们是在该shell中运行另一个进程。我们还可以看到我们的壳98%的时间都在睡觉。

TracerPid变量设置为0只是告诉您没有跟踪进程。

许多其他变量——以“Vm”开头的变量——与内存有关,而以“Sig”开头的变量则告诉您如何处理信号。有些可能被阻止,有些可能被忽视,还有一些可能被抓住。在查看所有000000000038400类型值时要记住的一件事是,这些都是位映射,但它们是用十六进制表示的。所以,每个数字代表了整个数值中的4位。

以SigBlk(阻塞信号)值为例。如果设置为上面所示的10000 sh,则为十六进制,即以二进制表示的10000000000000000。设置位17(从右数),信号17为SIGCHLD。这样,我们就能知道哪些信号被阻塞了。

我们的signals caught变量设置了更多位,但如果我们好奇的话,我们可以像这样把它们映射出来:

000000004 b813efb = = > 0100 1011 1000 0001 0011 1110 1111 1011  | | || | | || ||| |||| | || | | || | | || ||| |||| | |+- 1 = SIGHUP  | | || | | || ||| |||| | +-- 2 = SIGINT  | | || | | || ||| |||| +---- 4 = SIGILL  | | || | | || ||| |||+------ 5 = SIGTRAP  | | || | | || ||| ||+------- 6 = SIGABRT  | | || | | || ||| |+-------- 7 = rt_signal_lease  | | || | | || |||+--------- 8 =我  | | || | | || ||+------------ 10 = SIGUSR1  | | || | | || |+------------- 11 = SIGSEGV信号  | | || | | || +-------------- 12 = SIGUSR2  | | || | | |+---------------- 13 = SIGPIPE  | | || | | +----------------- 14 = SIGALRM  | | || | +--------------------- 17 = SIGCHLD  | | || +----------------------------- 发生24 = SIGXCPU | ||+------------------------------- 发生25 = SIGXFSZ  | | +-------------------------------- 26 = SIGVTALRM  | +---------------------------------- 28日= SIGWINCH  +-------------------------------------- 31 = SIGSYS

FDSize变量可以设置为256,但是我们可以看到使用的文件描述符只有0、1、2和255。只需检查fd目录的内容。

$ ls fd 0 1 2 255

我们还可以查看limits文件,看看shell上可以设置哪些限制。

猫美元限制限制软限制硬限制单位最大cpu时间无限无限秒最大文件大小无限无限的字节数据大小无限无限字节马克斯堆栈大小10485760无限字节马克斯核心文件大小马克斯驻留集无限无限无限无限字节字节马克斯过程50 50过程马克斯打开的文件1024 1024files Max locked memory 32768 32768 bytes Max address space unlimited unlimited bytes Max file locks unlimited unlimited locks Max pending signals 32375 32375 signals Max msgqueue size 819200 819200 bytes Max nice priority 0 0 Max realtime priority 0 0

环境文件显示了有关操作环境的一些细节——比如搜索路径。

$ cat environ USER=shsLOGNAME=shsHOME=/home/staff /shsPATH=/usr/local/bin:/bin:/usr/binMAIL= /var/mail/ shsshell =/bin/bashSSH_CLIENT=10.20.30.111 8506 22SSH_CONNECTION=10.20。30.111 8506 192.168.0.12 22SSH_TTY=/dev/pts/0TERM=xterm

另一个有趣的文件是io文件。如你所见,它报道的是读和写的字符。注意第一次和第二次运行之间的变化。

$ cat IO rchar: 1953940 wchar: 57247 syscr: 1791 syscw: 917 read_bytes: 8192 write_bytes: 8192 cancelled_write_bytes: 4096 $ cat IO rchar: 1955293 wchar: 57370 syscr: 1804 syscw: 921 read_bytes: 8192 write_bytes: 8192 cancelled_write_bytes: 4096
12 第1页
第1页共2页
SD-WAN买家指南:向供应商(和您自己)提出的关键问题