0

我正在尝试将 csh 脚本转换为 tcl 脚本,以便在 linux模块功能中使用。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 的限制,任何帮助将不胜感激。

4

2 回答 2

1

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

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

花几个小时阅读高级 Linux 编程

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

于 2013-09-10T19:51:45.987 回答
0

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
于 2018-06-23T09:13:34.560 回答