运行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脚本时,会通过子进程的方式来执行,而子进程的执行路径字段为:../oss_memcache_status/run.sh,会被grep过滤器留下,因此统计数量比预期要多1个。
解决方案为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...

前后端的那点小事
四年百度研发,了解一些前端、后端、服务器、数据库、产品等内容,大家一起来交流下。

前端打工人

3.3k 声望
379 粉丝
0 条评论
推荐阅读
一道题解:前端链式调用和事件循环
一道题目看到一个很有趣的题目:实现一个方法,支持链式调用。 {代码...} 解法话不多说,直接上代码: {代码...} 题解分析这个题目,首先要知道如何完成链式调用,就是设置一个类,类中声明的方法的结尾最后都会...

赵帅强8阅读 1.7k评论 7

如何使用zx编写shell脚本
在这篇文章中,我们将学习谷歌的zx库提供了什么,以及我们如何使用它来用Node.js编写shell脚本。然后,我们将学习如何通过构建一个命令行工具来使用zx的功能,帮助我们为新的Node.js项目引导配置。

chuck3阅读 1.2k

封面图
麒麟操作系统 (kylinos) 从入门到精通 - 综合篇
类别:笔记本型号:中国长城 UF712硬件平台:飞腾处理器(ArmV8 指令集)系统:银河麒麟操作系统 V10 SP1(2203) 关键词:信创,麒麟系统,linux,PKS,银河麒麟,飞腾,arm64,arm,FAQ,资料汇总特别说明:本文为综合信息...

码上世界1阅读 2.6k评论 10

封面图
windows 批处理bat,设置定时关机
文章来源:[链接] {代码...}

jigsaw2阅读 3.2k

如何批量 git pull 某个文件夹中的 git 仓库?
上代码用 shell 脚本可以比较方便实现:首先新建脚本:pull-all.sh {代码...} 填入如下内容: {代码...} 然后改一下权限: {代码...} 接下来就可以直接运行了: {代码...} 也可以不跟参数,会提示你输入目录~注意...

savokiss阅读 1.4k

封面图
linux 进程-基础知识
1:查找进程idpidof 命令find the process ID of a running program. {代码...} 2: 查找当前shell的进程id和父进程id分别对应 "echo $$" 和 "echo $PID" {代码...} 3:pstree查看进程树之间的关系4:Ct...

tim_xiao阅读 1.2k

Linux - Shell
一般使用#!/bin/bash来解析shell语法,当然还有zsh, ksh等,但一般用的最多的就是bash一、变量-e参数:解析echo中的特殊字符,如换行:echo -e "Hello \nWorld"1.1、 单引号 '如果变量被包含在单引号里...

阿南阅读 880

前端打工人

3.3k 声望
379 粉丝
宣传栏