大部分人在寫Shell 過濾進程的時候 都會使用 grep 在 ps aux 的輸出結果中查找指定的進程
但此時也會把 grep 進程也顯示出來 比如查找 pptpd 進程
會匹配出來兩條
復制代碼 代碼如下:
[root@selboo ~]# ps aux | grep pptp
root pts/ R+ : : grep pptp
root ? Ss Oct : /usr/sbin/pptpd
常見的防止grep進程出現的方法就是在對加一個管道 grep
v grep 進行過濾
復制代碼 代碼如下:
[root@selboo ~]# ps aux | grep pptp | grep v grep
root ? Ss Oct : /usr/sbin/pptpd
還有一個更方便的方法是用 正則 grep [p]ptpd來搜索pptpd這個進程
復制代碼 代碼如下:
[root@selboo ~]# ps aux | grep [p]ptp
root ? Ss Oct : /usr/sbin/pptpd
雖然說它比 grep
v grep 也未必方便多少
但是如果用大量循環的監控腳本上
每次都能減少一次系統grep調用
也就是減少一次創建進程
雖然提升很小可以忽略不計
但是用在shell寫的監控腳本上來說多少還有點提升的
優化就是注重細節嘛
以下是執行五次測試結果
使用grep
v grep 方式
復制代碼 代碼如下:
[root@selboo etc]# time for (( i=; i<=; i++ )) ;do ps aux | grep pptp | grep v pptp &>/dev/null; done
real ms ms ms ms ms
user ms ms ms ms ms
sys ms ms ms ms ms
使用正則方式
復制代碼 代碼如下:
[root@selboo etc]# time for (( i=; i<=; i++ )) ;do ps aux | grep [p]ptp &>/dev/null; done
real ms ms ms ms ms
user ms ms ms ms ms
sys ms ms ms ms ms
From:http://tw.wingwit.com/Article/program/qrs/201401/30220.html