Bash:UNIX中的Bash脚本是否适用于内存泄漏?

3

我想知道bash脚本是否存在内存泄漏问题?

执行后,系统是否会自动释放内存,还是我们需要在shell脚本中使用类似于C++的free命令来显式释放内存?如果是,哪些命令会导致内存泄漏问题。

如何检查shell脚本的内存使用情况(例如堆空间、栈空间、文本空间)?

由于我对bash脚本中的内存管理不太了解,因此任何信息都将不胜感激。


2
你的发行版所附带的Bash应该是一个稳定无错的版本。如果你怀疑有泄漏,为什么不获取Bash源代码【代码】并编译调试版本呢? - sjsam
2
还要检查 [调试] bash 脚本。 - sjsam
1
根据我的经验,如果你在脚本中使用 <proc> & 启动一个进程,存在进程无法终止而挂起的风险。这时你需要找到它们并杀死进程ID。你可以像这样跟踪启动的进程:my_child_PID=$! 以防止进程挂起。 - Ola
2
bash 脚本的主要目的是运行其他程序(它们本身可能有内存泄漏问题,但这是另一个问题)。bash 脚本使用的唯一内存是用于其参数,但如果您的脚本管理的数据量太大,导致内存使用成为问题,那么您正在使用错误的语言。 - chepner
1
不要浪费时间寻找内存泄漏,除非你真的遇到了问题。仅有内存泄漏并不是问题;只有那些在首次分配大量内存后随后没有释放该内存的程序才是问题。而且,任何可能使用那么多内存的脚本都不应该用bash编写,无论是否可能发生泄漏。 - chepner
显示剩余3条评论
1个回答

2

我对内存泄漏的定义(来自维基百科):在计算机科学中,内存泄漏是一种资源泄漏类型,发生在计算机程序错误地管理内存分配,以至于不再需要的内存没有被释放。

因此,fork bomb 不符合内存泄漏的条件,因为内存仍然是需要的。

你不能直接使用 bash 自己管理内存,所以不,你不能在纯粹版本的无错误 bash 代码中创建内存泄漏。

如果不是这种情况(你有错误或使用外部代码),那么答案是肯定的,你可以使用类似 Valgrind 这样的工具。无论是在你的 bash 脚本上使用还是在调用外部代码时使用(从 bash 脚本内部调用)。

它支持许多平台,并且适用于任何语言。


那么我们如何跟踪不同的内存空间(如堆栈、堆、文本等)以用于Bash脚本?或者这些概念是否适用于Bash脚本? - Mathews Jose
3
“你不能有内存泄漏。”- 这不正确,一个简单的情况就是将一个由自己编译的 C 二进制文件作为 Bash 内置命令添加进去,如果这个二进制文件有内存泄漏怎么办。 - sjsam
4
在Bash语言中制造内存泄漏的方法是使用另一种语言。好吧...使用Valgrind吧。我的意思是,你问一个球能不能切开你,我回答不行,而你的回答是,如果我用刀呢? - Adrien Horgnies
1
@LittleNooby 的意思是 bash 是用 c 写成的,因此你当然可以在 bash 中有内存泄漏。更准确地说,在一个完全没有 bug 的纯 bash 代码版本中是无法 创建 内存泄漏的。 - Reinstate Monica Please
1
啊,也许是我的误解。我不认为 fork bomb 是内存泄漏。我认为内存泄漏是指程序分配了内存,在结束前没有释放,因此你不能在不重启系统的情况下回收该内存。而对于 fork bomb,使用内存的程序并没有结束,只要你有足够的内存来启动 kill 指令,就可以回收内存。 - Adrien Horgnies
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接