運行shell腳本時進程數量變多

寫了一個很簡單的腳本,用於統計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 bashgit

執行shell腳本的方式

咱們有三種經常使用的方式執行shell腳本:github

  • source run.sh: 會在當前進程下執行腳本,執行時的變量會保存下來。
  • . run.sh: 和source方法基本同樣,區別在於source不是POSIX要求的。
  • ./run.sh: 若是腳本以#!/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

  1. 刪除腳本頭部#!/bin/bash
  2. 增長過濾:grep -v bash
  3. 改變調用方式:source run.sh

參考資料

  1. 執行 shell 腳本時,「source」、「. 」和「./」的區別:https://hoxis.github.io/linux...
相關文章
相關標籤/搜索