【问题标题】:Set limit on coredumpsize using modules使用模块设置 coredumpsize 的限制
【发布时间】:2013-09-10 19:42:55
【问题描述】:

我正在尝试将 csh 脚本转换为 tcl 脚本,以便在 linux modules 功能中使用。 csh 脚本最初用于为软件包正确设置环境变量。我不想让最终用户在每次他/她希望使用该软件时更改他的 shell 并运行 3 个命令,而是想创建一个简单的单行命令,该命令独立于 shell 并适当地设置他们的环境。因此,使用 modulefile 似乎是完成此任务的完美方式。

当我尝试对 coredumpsize 设置限制时出现了我的问题,因为似乎没有任何方法可以从模块内设置此值。原始的 csh 命令如下所示,limit coredumpsize 0。我知道与此等效的原始 bash 命令行是 ulimit -c 0。 注意:这两个命令都假设我想在使用这个软件时禁用 coredumpfiles。

我的模块文件代码尝试以依赖于 shell 的方式调用此命令,b/c 似乎没有模块文件本机的“限制”命令。

set shell [module-info shell]
if { $shell=="bash"} {
    set XARCH amd64
    [exec /bin/bash -c "ulimit -c 0"]
} elseif {$shell=="tcsh"} {
    set XARCH linux
    [exec /bin/tcsh -c "limit coredumpsize 0"]

根据我在网络范围内的研究,我找不到可以修改的环境变量,尽管 RLIMIT_CORE 看起来可能接近我正在寻找的。我当前代码的问题是 exec 命令生成一个 $shell 进程并运行一个命令,而不是在调用 tcl 模块进程的 shell 上运行 limit 命令。

如果能够以一种简单的方式(最好是使用模块)更改环境变量并设置 coredumpsize 的限制,我们将不胜感激。

【问题讨论】:

  • 我要么将该 csh 脚本转换为 Posix sh(或 bash),甚至考虑使用比 Tcl 更强大(恕我直言,更性感)的GNU guile .
  • 转换脚本有什么帮助?您是否建议我为 bash 用户制作一个免费的脚本并让他们运行它?这在我们的实例中不会完全有帮助,因为我还试图让用户不必在每次运行软件时都输入 3-4 个额外的命令。我还试图避免让最终用户始终编辑他们的一般环境(b/c 他们可以将环境变量更改添加到他们的 .bashrc 文件中)

标签: linux tcl limit ulimit modulefile


【解决方案1】:

您不能通过运行 shell 来设置限制,因为该限制只会影响您创建的 shell 进程(而不影响tcl 进程本身)。

您需要了解如何直接调用setrlimit(2) 系统调用。也许tclx 可能会有所帮助。

花几个小时阅读Advanced Linux Programming。

您误解了一些基本的 Unix 概念,尤其是进程。

【讨论】:

  • 我知道我无法通过运行 exec 命令来生成新进程来设置限制。我把它放在我的代码示例中,以便审阅者可以了解我最初的起点。话虽如此,我想弄清楚是否有一些环境变量可以控制我可以设置的 coredumpsize,或者是否有另一种方法来更改 coredumpsize。我不确定 tclx 是否能正常工作我不明白如何将它与 modulecmd 一起使用。您能否就此提供见解?或者,您知道如何在 modulecmd 中进行系统调用吗?
  • 在您的Modules 中启用TclX;否则在 C 中为setrlimit 编写(或复制)一个简单的包装器。 Tcl 从一开始就有调用 C 代码的能力。
【解决方案2】:

module 在当前运行的 shell 上评估模块文件评估在标准输出上产生的内容。

以下 ulimit 模块文件应该有助于在当前运行的 shell 上设置应用给定的 ulimit 配置

#%Module

switch -- [module-info shelltype] {
    {sh} {
        puts stdout "ulimit -c 0"
    }
    {csh} {
        puts stdout "limit coredumpsize 0"
    }
}

正在加载模块文件,我们可以检查当前 shell 上的 ulimit 配置是否已更改:

$ ulimit -c
unlimited
$ module -V
Modules Release 4.1.3 (2018-06-18)
$ module load ./ulimit
$ ulimit -c
0

【讨论】:

    猜你喜欢
    • 2015-04-26
    • 1970-01-01
    • 2016-12-30
    • 2019-02-15
    • 2011-02-14
    • 2018-08-16
    • 1970-01-01
    • 2014-02-06
    • 1970-01-01
    相关资源
    最近更新 更多