1. 程式人生 > 其它 >ps -ef | grep 檢視程序是否存在 命令詳解

ps -ef | grep 檢視程序是否存在 命令詳解

格式: ps -ef | grep 查詢資訊

ps: 將某個程序顯示出來

grep:(Global Regular Expression Print)查詢的意思,使用的許可權是所有的使用者,它是一種強大的文字搜尋工具,能使用正則表示式搜尋文字,並把匹配的行打印出來

|:管道命名,指的是 ps 命令和 grep 命令同時執行(可以把它看做是一個連線的作用)

-e:顯示所有程序

-f:全格式

比如:

//以下這條命令是檢查 java 程序是否存在:ps -ef |grep java
[root@localhost ~]# ps -ef|grep java
UID     PID  PPID  C  STIME  TTY    TIME     CMD
root
3121 2902 0 12:13 pts/5 00:00:00 grep --color=auto java root 3206 1 0 Apr07 ? 00:05:46 /home/java/jdk1.8.0_221/bin/java -Djava.util.logging.config.file=/usr/local/tomcat/apache-tomcat-8.5.45-jenkins/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048
-Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -classpath /usr/local/tomcat/apache-tomcat-8.5.45-jenkins/bin/bootstrap.jar:/usr/local/tomcat/apache-tomcat-8.5.45-jenkins/bin/tomcat-juli.jar -Dcatalina.base=/usr/local/tomcat/apache-tomcat-8.5
.45-jenkins -Dcatalina.home=/usr/local/tomcat/apache-tomcat-8.5.45-jenkins -Djava.io.tmpdir=/usr/local/tomcat/apache-tomcat-8.5.45-jenkins/temp org.apache.catalina.startup.Bootstrap start
//以下這條命令是檢查 redis 程序是否存在:ps -ef |grep redis
[root@localhost ~]# ps -ef | grep redis
root      6282  2761  0 20:15 pts/0    00:00:13 redis-server *:6379
root      9519  9142  0 20:48 pts/3    00:00:00 grep --color=auto redis

 

1. 具體的欄位含義如下:

UID:使用者ID,指的是程式被該UID所擁有,但輸出的是使用者名稱,比如上述輸出的是root 使用者

PID:程序的ID,該程式的ID

PPID:父程序ID,上級父程式的ID

C:該程序佔用CPU的百分比  

STIME:程序啟動到現在的時間

TTY:登入者的終端機位置,該程序在哪個終端上執行,若與終端無關,則顯示? 若為pts/0等,則表示由網路連線主機程序。

TIME:使用掉的CPU時間

CMD:啟動程序的命令和引數

 

2. grep程序本身

通常在使用 ps命令後 用管道連線 查詢特定程序會顯示 grep程序本身。比如以下截圖中的第三行,字尾一般是:grep --color=auto XXX

 

有時候查詢結果其實 都是沒有對應這個程序。但是會顯示了 grep程序的本身,有的人會認為這就是自己想要的 程序,結果用 kill -9 PID 時提示程序號不存在.......

 

 

 

如何判斷該程序是否是 grep程序本身? 看下方指令,你就會明白了。

程序號一直的變的那個程序是 grep程序本身(橙色標註)5344 -->5384 --> 5422

正常程序號,比如redis的PID不會變。(綠色標註)9717 -->9717 -->9717

[root@localhost app]# ps -ef | grep redis
root      5344  9142  0 12:45 pts/3    00:00:00 grep --color=auto redis
root      9717     1  0 Apr07 ?        00:00:57 /usr/local/redis/redis-4.0.6/bin/redis-server 10.10.1.132:6379
[root@localhost app]# ps -ef | grep redis
root      5384  9142  0 12:45 pts/3    00:00:00 grep --color=auto redis
root      9717     1  0 Apr07 ?        00:00:57 /usr/local/redis/redis-4.0.6/bin/redis-server 10.10.1.132:6379
[root@localhost app]# ps -ef | grep redis
root      5422  9142  0 12:45 pts/3    00:00:00 grep --color=auto redis
root      9717     1  0 Apr07 ?        00:00:57 /usr/local/redis/redis-4.0.6/bin/redis-server 10.10.1.132:6379

 

3. 如何過濾掉grep程序本身的輸出:

方法 一:在程序名 任何一個字母上新增 [ ]

[root@localhost app]# ps -ef | grep redis
root      6079  9142  0 12:55 pts/3    00:00:00 grep --color=auto redis
root      9717     1  0 Apr07 ?        00:00:57 /usr/local/redis/redis-4.0.6/bin/redis-server 10.10.1.132:6379
[root@localhost app]# ps -ef | grep [r]edis root 9717 1 0 Apr07 ? 00:00:57 /usr/local/redis/redis-4.0.6/bin/redis-server 10.10.1.132:6379

因為字母加上 [ ] 後,

此時 grep程序的引數是 grep --color=auto [r]edis(注意看和上方程式碼框中深藍標記的區別!!!)

而 grep [r]edis 正則表示式 匹配的是 'redis' 這個字串,

因此這個 grep [r]edis 正則表示式 並不能匹配到 ' [r]edis' 這個字串。(也就是grep的程序)

所以自然不會出現grep程序本身。

 

方法二: 在程序 後面 加  | grep -v grep 

    -v 引數含義為:不包括

[root@localhost app]# ps -ef | grep redis
root      6676  9142  0 13:02 pts/3    00:00:00 grep --color=auto redis
root      9717     1  0 Apr07 ?        00:00:58 /usr/local/redis/redis-4.0.6/bin/redis-server 10.10.1.132:6379
[root@localhost app]# ps -ef | grep redis | grep -v grep
root      9717     1  0 Apr07 ?        00:00:58 /usr/local/redis/redis-4.0.6/bin/redis-server 10.10.1.132:6379