ps

  

  Linux 系统中,有一个常用的命令叫做 ps,它的全称是 process status,即进程状态。它可以用来显示当前系统中运行的进程的各种信息,比如进程的 ID,用户,CPU 占用率,内存占用率,启动时间,运行时间,命令行等。ps 命令有很多参数,可以根据不同的需求来选择不同的输出格式和内容。

  grep 是另一个常用的命令,它的全称是 global regular expression print,即全局正则表达式打印。它可以用来在文本中搜索符合指定正则表达式的内容,并把匹配的行打印出来。grep 命令也有很多参数,可以根据不同的需求来选择不同的匹配模式和输出格式。

  ps 和 grep 命令可以结合起来使用,形成一个管道命令,即 ps -ef | grep 关键字。这个命令的意思是先用 ps -ef 命令列出所有进程的信息,然后用 grep 命令过滤出包含指定关键字的进程信息。这样就可以快速地找到我们感兴趣的进程,并查看它们的状态。

  下面我们来具体解释一下 ps -ef | grep 关键字 这个命令的结果含义。首先,我们要了解 ps -ef 命令的输出格式。ps -ef 命令会显示以下几个字段:

  - UID:进程的拥有者

  - PID:进程的 ID

  - PPID:进程的父进程 ID

  - C:进程占用 CPU 的百分比

  - STIME:进程启动的时间

  - TTY:进程所在的终端设备

  - TIME:进程运行的时间

  - CMD:进程执行的命令

  例如,我们执行 ps -ef | grep php 这个命令,就可以看到如下输出:

  root 794 1 0 2020 ? 00:00:52 php-fpm: master process (/etc/php/7.3/fpm/php-fpm.conf)

  www-data 951 794 0 2020 ? 00:24:15 php-fpm: pool www

  www-data 953 794 0 2020 ? 00:24:14 php-fpm: pool www

  www-data 954 794 0 2020 ? 00:24:29 php-fpm: pool www

  这个输出表示系统中有四个 php 相关的进程在运行。第一行是 php-fpm 的主进程,它是由 init 进程(PID=1)启动的,它没有终端设备(TTY=?),它从 2020 年开始运行,占用了 52 秒的 CPU 时间。第二行到第四行是 php-fpm 的子进程,它们是由主进程(PID=794)启动的,它们也没有终端设备(TTY=?),它们从 2020 年开始运行,分别占用了 15 秒,14 秒和 29 秒的 CPU 时间。

  当然,ps -ef | grep 关键字 这个命令也有一些注意事项。首先,这个命令会把 grep 关键字 自身也作为一个进程显示出来,因为 grep 命令也会匹配自己的命令行。例如,我们执行 ps -ef | grep ApacheJetspeed 这个命令,就会看到如下输出:

  root 18887 18828 0 08:09 pts/0 00:00:00 grep ApacheJetspeed

  这个输出表示系统中没有 ApacheJetspeed 相关的进程在运行,只有一个 grep ApacheJetspeed 的进程在运行。如果我们想要排除掉 grep 自身这个进程,我们可以使用一个小技巧,就是在关键字中加入一个正则表达式元字符 [ ] ,例如 [A]pacheJetspeed 。这样就可以避免 grep 命令匹配自己了。

  其次,这个命令只能根据关键字进行粗略地过滤,并不能保证过滤出来的结果都是我们想要的。例如,我们执行 ps -ef | grep java 这个命令,就会看到如下输出:

  root 18888 794 99 Oct20 ? 1-01:02:03 java -jar ApacheJetspeed.jar

  root 18889 794 99 Oct20 ? 1-01:02:03 java -jar Tomcat.jar

  root 18890 794 99 Oct20 ? 1-01:02:03 java -jar Jetty.jar

  root 18891 794 99 Oct20 ? 1-01:02:03 java -jar SpringBoot.jar

  root 18892 794 99 Oct20 ? 1-01:02:03 java -jar Minecraft.jar

  root 18893 794 99 Oct20 ? 1-01:02:03 java -jar Solr.jar

  root 18894 794 99 Oct20 ? 1-01:02:03 java -jar Elasticsearch.jar

  root 18895 794 99 Oct20 ? 1-01:02:03 java -jar Kafka.jar

  root 18896 794 99 Oct20 ? 1-01:02:03 java -jar Spark.jar

  root 18897 794 99 Oct20 ? 1-01:02:03 java -jar Hadoop.jar

  root 18898 794 99 Oct20 ? 1-01:02:03 java -jar Zookeeper.jar

  这个输出表示系统中有十一个 java 相关的进程在运行。但是,并不是所有这些进程都是我们感兴趣的。例如,我们可能只想要查看 ApacheJetspeed 的进程状态,而不关心其他 java 应用程序或游戏。如果我们想要更精确地过滤出我们想要的结果,我们可以使用更复杂或更具体的正则表达式作为关键字。例如,我们可以执行 ps -ef | grep "java.*ApacheJetspeed" 这个命令,就会看到如下输出:

  root 18888

  这个输出表示系统中只有一个 ApacheJetspeed 相关的进程在运行。

  总之,ps -ef | grep 关键字 这个命令结果含义是显示包含指定关键字的进程信息,并且每个字段都有特定的含义和格式。这个命令可以帮助我们快速地查看系统中运行的进程状态,并进行相应地管理或调试。但是这个命令也有一些局限性和注意事项,在使用时需要根据实际情况进行调整和优化。

  举报/反馈