【问题标题】:Bash: Is memory leak applicable for a bash script in UNIX?Bash:内存泄漏是否适用于 UNIX 中的 bash 脚本?
【发布时间】:2016-05-29 07:06:36
【问题描述】:

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

系统是否会在执行后自动释放内存,或者是否有任何我们必须在 shell 脚本中使用的显式命令(如 C++ 中的 free 命令)?如果是,什么样的命令会导致内存泄漏问题。

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

感谢任何信息,因为我不太了解 bash 脚本中的内存管理。

【问题讨论】:

  • 你的发行版中的 bash 应该是一个稳定的无错误版本。如果你怀疑有泄漏,为什么不获取 bash 源代码[ code ] 并编译一个调试版本。
  • 还要检查[ debugging ] bash 脚本。
  • 根据我的经验。是的!如果您在脚本中使用<proc> & 启动一个进程。存在进程未终止并将挂起的风险。然后你必须找到它们并杀死 pids。您可以像这样跟踪已启动的进程:my_child_PID=$! 以防止进程挂起。
  • bash 脚本的主要目的是运行 other 程序(它们本身可能存在内存泄漏,但这是另一个问题)。 bash 脚本使用的唯一内存是其参数,但如果您的脚本管理的数据太多以至于其内存使用成为问题,那么您使用的语言有误。
  • 在真正遇到问题之前,不要浪费时间寻找内存泄漏。单独的内存泄漏不是问题;只有首先分配大量内存但随后不释放该内存的程序才是。同样,任何一开始就可能使用这么多内存的脚本都不应该写在bash中,无论是否可能泄漏。

标签: bash shell unix memory-leaks scripting


【解决方案1】:

我对内存泄漏的定义(来自维基百科):在计算机科学中,内存泄漏是一种资源泄漏,发生在计算机程序错误地管理内存分配 [1] 以致不再需要内存时未发布。

所以叉子炸弹不符合条件,因为内存仍然需要。

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

因此,如果不是这种情况(您有错误或使用外部代码),答案是肯定的,您可以使用 Valgrind 之类的工具。在您的 bash 脚本或外部代码调用中使用它(从 bash 脚本中)。

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

【讨论】:

  • 那么我们如何跟踪 bash 脚本的不同内存空间(如堆栈、堆、文本等)?还是所有这些概念都适用于 bash 脚本
  • , you can't have memory leaks. - 不正确,一个简单的例子是你添加一个 c 二进制文件 - 你自己编译 - 作为一个 bash 内置函数,如果二进制文件有泄漏怎么办..
  • 因此,在语言 bash 中创建内存泄漏的方法是使用另一种语言。好的...使用 valgrind。我的意思是,你问球是否能割伤你,我回答不会,你回答,如果我插刀怎么办?
  • @LittleNooby sjsam's 点是bash 写在c,所以你当然可以有memory leaks in bash。更准确地说,在使用纯 bash 代码的完美无错误版本的 bash 中,create 不会发生内存泄漏。
  • 啊,可能是我的理解有误。我不认为叉炸弹是内存泄漏。我认为内存泄漏是分配给程序的内存,它在结束之前没有释放,因此如果不重新启动系统就无法取回该内存。对于 fork 炸弹,使用内存的程序并没有结束,如果你有足够的内存来启动 kill 指令,你可以取回内存。
猜你喜欢
  • 2021-08-11
  • 1970-01-01
  • 1970-01-01
  • 2010-12-05
  • 1970-01-01
  • 2011-02-05
  • 2018-10-09
  • 2021-08-12
  • 2021-06-05
相关资源
最近更新 更多