ps – report process status

本文于2017年3月19号发布在个人博客中,因为个人博客关闭,全部迁移到CSDN,以下是正文:


引言

提到linux ps命令,相信所有在linux开发的程序员都用过

有人是这样的:

ps -ef | grep httpd

这里写图片描述
也有人是这样的:

$ ps -aux | grep httpd

这里写图片描述
如果想要了解详细的信息,请移步:man ps,或者

$ man ps

这里写图片描述

内容有点多,我英语也不好,说下去会露馅了,进入我们今天的主题:在linux下如何监控进程(包括:状态,CPU使用率,已使用内存等)?

我做了以下的尝试:

  • 使用第三方库,python就有psutil
  • 通过proc下的stat文件
  • 基于linux ps命令

如果没有各种麻烦的审核流程,第一个可以说是最省事的,第二个是最麻烦的,需要自己解析各个字段并做相应的计算,最终选择了第三种

/proc/[pid]/stat

第二种我想多说几句,以上面的httpd进程为例,进程ID:1153,那么在”/proc”目录下必定有一个”1153″目录,如下:

$ ls /proc/1153

进程状态相关的信息全在”/proc/1153/stat”文件里了,详细的可以参考:man proc,直接翻到”/proc/[pid]/stat”章节:

/proc/[pid]/stat
              Status information about the process.  This is used by ps(1).
              It is defined in the kernel source file fs/proc/array.c.

              The fields, in order, with their proper scanf(3) format
              specifiers, are listed below.  Whether or not certain of these
              fields display valid information is governed by a ptrace
              access mode PTRACE_MODE_READ_FSCREDS | PTRACE_MODE_NOAUDIT
              check (refer to ptrace(2)).  If the check denies access, then
              the field value is displayed as 0.  The affected fields are
              indicated with the marking [PT].

              (1) pid  %d
                        The process ID.

              (2) comm  %s
                        The filename of the executable, in parentheses.
                        This is visible whether or not the executable is
                        swapped out.

              (3) state  %c
                        One of the following characters, indicating process
                        state:

                        R  Running

                        S  Sleeping in an interruptible wait

                        D  Waiting in uninterruptible disk sleep

                        Z  Zombie

                        T  Stopped (on a signal) or (before Linux 2.6.33)
                           trace stopped

                        t  Tracing stop (Linux 2.6.33 onward)

                        W  Paging (only before Linux 2.6.0)

                        X  Dead (from Linux 2.6.0 onward)

                        x  Dead (Linux 2.6.33 to 3.13 only)

                        K  Wakekill (Linux 2.6.33 to 3.13 only)

                        W  Waking (Linux 2.6.33 to 3.13 only)

                        P  Parked (Linux 3.9 to 3.13 only)
......

linux ps

同样只适合在linux操作系统之上,ps命令就比”/proc/[pid]/stat”简单多了

进程状态

$ ps --pid $pid -o pid,stat

这里写图片描述

已使用内存(%)

$ ps --pid $pid -o pid,%mem

这里写图片描述

已使用内存(KB)

$ ps --pid $pid -o pid,rss

这里写图片描述

CPU利用率

$ ps --pid $pid -o pid,%cpu

这里写图片描述

根据名称找pid

$ ps -e -o pid,comm
$ ps -e -o pid,cmd

这里写图片描述
你可能已经发现上面的命令都是具体到某个pid的,但实际场景中我们可能只知道进程名称不知道进程ID,可以按照如下步骤查找进程名称对应的进程ID

  1. $ ps -e -o pid,comm。如果查出来有多个,进程名称都是python,但python启动的脚本不一样,那就得使用第二招了
  2. $ ps -e -o pid,cmd。现在就可以清晰的看出来启动了哪个脚本了吧,同样地适用于所有通过A程序启动B程序的情况

这里写图片描述
仅仅通过”ps -e -o pid,comm”是无法区分我是”python comm1.py”还是”python comm2.py”还是”python comm3.py”的,我们需要使用”$ ps -e -o pid,cmd”进行更精确的匹配

子进程

还有一种场景:进程启动了多个子进程,需要首先找到父进程,然后找出所有的子进程

  1. 查找父进程可以通过进程名称来判断,如果当前进程的父进程的名称跟输入的进程名称相同则继续查找祖父进程,直到某进程的父进程名称跟输入进程名称不同,则为所要找的父进程
  2. 查找某个进程的所有子进程可以通过–ppid过滤

这里写图片描述
掌握以上知识,相信你已经能够编写出监控进程的代码了

©️2020 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值