寫了一個很簡單的腳本,用於統計memcache進程的數量:
#!/bin/bash
echo `ps aux | grep memcache | grep -v grep | wc -l`
然而在執行時卻遇到了問題:
[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腳本時,會通過子進程的方式來執行,因此統計數量比預期要多。
解決方案爲grep -v bash
。
執行shell腳本的方式
我們有三種常用的方式執行shell腳本:
- source run.sh: 會在當前進程下執行腳本,執行時的變量會保存下來。
- . run.sh: 和source方法基本一樣,區別在於source不是POSIX要求的。
- ./run.sh: 如果腳本以
#!/bin/bash
開頭,會在單獨的子進程中執行,執行完畢後變量不保存。否則和source一樣。
因此,在上面的腳本中,我們在執行時,因爲是以#!/bin/bash
開頭,會在子進程中執行,我們改動一下腳本看都是哪些進程:
#!/bin/bash
echo `ps aux | grep memcache | grep -v grep`
執行:
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腳本的進程和調起的子進程(這兩個什麼區別,我也不太清楚),第三個爲真正的進程。
防止進程數量增多
解決方案:
- 刪除腳本頭部
#!/bin/bash
- 增加過濾:
grep -v bash
- 改變調用方式:source run.sh
參考資料
- 執行 shell 腳本時,「source」、「. 」和「./」的區別:https://hoxis.github.io/linux...