我正在尝试将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进程并运行one命令,而不是在调用tcl模块进程的shell上运行limit命令。
如果能够以一种简单的方式更改环境变量和设置coredumpsize的限制,理想情况下使用模块,将非常感谢任何帮助。
答案 0 :(得分:1)
您无法通过运行shell来设置限制,因为该限制只会影响您创建的shell进程(而不是tcl
进程本身)。
您需要了解如何直接调用setrlimit(2)系统调用。也许tclx可能有帮助。
花几个小时阅读Advanced Linux Programming。
你误解了一些基本的Unix概念,特别是进程。
答案 1 :(得分:0)
module
在当前正在运行的shell上评估在stdout上生成的modulefile评估。
以下ulimit
模块文件应有助于设置在当前运行的Shell上应用给定的ulimit配置
#%Module
switch -- [module-info shelltype] {
{sh} {
puts stdout "ulimit -c 0"
}
{csh} {
puts stdout "limit coredumpsize 0"
}
}
加载模块文件,我们可以检查当前外壳上的ulimit配置是否已更改:
$ ulimit -c
unlimited
$ module -V
Modules Release 4.1.3 (2018-06-18)
$ module load ./ulimit
$ ulimit -c
0