写了一个很简单的脚本,用于统计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