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

寫了一個很簡單的腳本,用於統計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腳本的進程和調起的子進程(這兩個什麼區別,我也不太清楚),第三個爲真正的進程。

防止進程數量增多

解決方案:

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

參考資料

  1. 執行 shell 腳本時,「source」、「. 」和「./」的區別:https://hoxis.github.io/linux...
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章