寫了一個很簡單的腳本,用於統計memcache進程的數量:html
#!/bin/bash echo `ps aux | grep memcache | grep -v grep | wc -l`
然而在執行時卻遇到了問題:linux
[work@ oss_memcache_status]$ pwd /home/work/cdn/monitor/ocelot-scripts/oss_memcache_status [work@ oss_memcache_status]$ ./run.sh 1 [work@ oss_memcache_status]$ ../oss_memcache_status/run.sh 3
這個緣由是由於咱們在執行shell腳本時,會經過子進程的方式來執行,而子進程的執行路徑字段爲:../oss_memcache_status/run.sh
,會被grep過濾器留下,所以統計數量比預期要多1個。
解決方案爲grep -v bash
。git
咱們有三種經常使用的方式執行shell腳本:github
#!/bin/bash
開頭,會在單獨的子進程中執行,執行完畢後變量不保存。不然和source同樣。所以,在上面的腳本中,咱們在執行時,由於是以#!/bin/bash
開頭,會在子進程中執行,咱們改動一下腳本看都是哪些進程:shell
#!/bin/bash echo `ps aux | grep memcache | grep -v grep`
執行:bash
work 24414 0.0 0.0 108116 1276 pts/0 S+ 15:31 0:00 /bin/bash ../oss_memcache_status/run.sh work 24415 0.0 0.0 108116 612 pts/0 S+ 15:31 0:00 /bin/bash ../oss_memcache_status/run.sh work 30558 0.0 0.0 371236 47096 ? Ssl 2016 15:14 /usr/local/bin/memcached -d -m 256 -u nobody -l localhost -p 11211
咱們經過結果,能夠看出來,第一個進程和第二個進程的父進程相同,他們都屬於當前終端啓動的進程。前兩個分別爲執行run腳本的進程和調起的子進程(這兩個什麼區別,我也不太清楚),第三個爲真正的進程。memcached
解決方案:code
#!/bin/bash
grep -v bash