Linux 为什么在Bash上使用groovyshell脚本(当内存占用很重要时)?

Linux 为什么在Bash上使用groovyshell脚本(当内存占用很重要时)?,linux,bash,groovy,Linux,Bash,Groovy,我有一个Bash脚本(50行代码),由于Bash的局限性,需要进行一些黑客攻击。所以有人说:“嘿,用一种比bash更好的语言!” 所以,我看了Groovy(Groovy/Grails是我的下一个学习列表,所以这可能是一个好时机)。我可以编写更复杂的shell脚本,所以这可能非常适合 但是当我运行一个简单的Groovy脚本(while(true){…})时,Java进程的内存消耗是123M,哎哟,我有大约10个这样的脚本要在一个有650M内存的盒子上运行(现在都是基于bash的)。等效的独立bas

我有一个Bash脚本(50行代码),由于Bash的局限性,需要进行一些黑客攻击。所以有人说:“嘿,用一种比bash更好的语言!”

所以,我看了Groovy(Groovy/Grails是我的下一个学习列表,所以这可能是一个好时机)。我可以编写更复杂的shell脚本,所以这可能非常适合

但是当我运行一个简单的Groovy脚本(
while(true){…}
)时,Java进程的内存消耗是123M,哎哟,我有大约10个这样的脚本要在一个有650M内存的盒子上运行(现在都是基于bash的)。等效的独立bash脚本在大约150万内存中运行

那么,这是一个:

  • 我是一个做错事的新手,123M内存占用不是必需的吗
  • Groovy不适合这里?也许Python或Perl更注重内存
  • bash是一个很好的选择,即使对于它的缺点,当一个小的足迹是重要的

如果内存受到这样的限制,那么JVM上运行的任何语言都将处于不利地位。Groovy就是这样一种语言

其他语言,如Python或Perl,运行时更精简,简单脚本所需的内存更少(我猜Python仍然比Perl精简一些,但我无法用数字来支持这一点)

在我看来,Python是bash脚本的一个很好的升级,它提供了更好的特性,同时仍然足够精练,可以在普通脚本中使用


bash本身是一种很好的脚本语言,具有合理的内存需求。如果内存占用非常重要,那么另一个兼容POSIX的shell(例如)可能是合理的替代品。请注意,
bash
的许多但并非所有功能都出现在与POSIX兼容的现代shell中。

如您所说,使用python或perl,对于这种情况,它们的内存占用要小得多。

当您启动并运行在JVM上的应用程序时,您应该能够配置堆大小和永久空间等会影响内存占用的内容。如果您需要用Java、Groovy、Jython、JRuby或Scala编写,那么请查看如何为您的应用程序设置

是的,基于JVM的语言在内存消耗方面是众所周知的,例如对象的8字节开销和填充的需要,这使得整数对象需要比您想象的多得多的内存(请在某处查找:-))。然而,JVM提供了很多优势:在过去15年中,大多数JVM都被非常聪明的人进行了高度调优和优化(你能写出那么好的垃圾收集器吗?)。Java平台非常庞大。它拥有一切

您的10个脚本是否长期运行并且需要同时驻留内存?还是他们跑得快?因为您已经用Bash编写了它们,所以听起来您不需要富Java平台。你只是在移动文件,切割,变大,变粗,整理

Aas是一条经验法则,我喜欢Bash编写小脚本,但一旦我有了一两个循环和几个变量(基本上是任何涉及逻辑的东西,而不是if语句),Ruby和Python看起来就更容易阅读和维护了。Groovy并不一定是个坏选择(尽管其他语言更受欢迎)。但就内存占用问题而言,您应该花时间尝试和调优基于JVM的应用程序,并进行一些测量。在你的情况下,这可能没什么大不了的。也许JVM启动时间是一个因素?这在很大程度上取决于您的具体情况。

请记住,“groovy”只是启动“java-cp groovy.jar:$CLASSPATH”或类似内容的包装器脚本。这意味着您应该检查是否存在影响预分配内存的JVM标志,并相应地更改它们。
那些Scritp会互相打电话吗?如果是这样的话,试着让它们成为groovy类,并试着在同一个VM中运行它们。

当您想在命令行上运行quickie时,Java通常会遇到问题。我在使用(和扩展)一个名为的工具方面取得了很大的成功。它基本上运行一个JVM实例,并使用本机客户端将脚本或基本命令传输到服务器进行评估,输出流转换为命令行标准输出。结果相当令人印象深刻

也看到这个。引述:

下面是一个JRuby在OSXJava6上的启动时间示例,第一个是正常启动时间,第二个是正常启动时间 然后是ng:

正常:

~/NetBeansProjects/jruby$time jruby-e“放置‘hello’”hello

真正的0m1.944s用户0m1.511s系统0m0.138s

钉枪:

~/NetBeansProjects/jruby$time jruby-e“放置‘hello’”hello

实际0m0.103s用户0m0.006s系统0m0.009s

这里有一个公式:

  • 使用Bash来编写脚本,这些脚本只会刺激其他程序
  • 避免使用Perl,除非您认为自己是一个过时的死硬黑客
  • 将Python或Ruby用于自动化轻量级任务的脚本
  • 将Groovy或Scala用于自动化繁重任务的脚本

Groovy和Scala对于琐碎的任务来说是一种致命一击,但对于推土机的情况来说却是天赐良机——严肃的脚本使JVM看起来相当节俭。

我还想将Ruby添加到列表中。我喜欢Python,但有些事情(调用shell命令和解析输出、正则表达式)比必要的要困难得多。Ruby,Oto,是一种可读性更强的Perl,这使得它对于小系统管理脚本来说非常棒。我没有任何Ruby方面的经验,但是看到它被描述为“更可读的Perl”,我真的很想学习它@Joachim:Ruby看起来不错,但是看到Linux发行商的问题(缺乏向后兼容性,不愿意支持系统范围的库安装),我就不相信它。这是一个社区问题,而不是语言问题(类似的态度)