Установить ограничение на размер дампа памяти с помощью модулей

Я пытаюсь преобразовать сценарий csh в сценарий tcl для использования в модулях Linux функциональность. Сценарий csh изначально использовался для правильной установки переменных среды для программного пакета. Вместо того, чтобы просить конечного пользователя изменить свою оболочку и запускать 3 команды каждый раз, когда он/она хочет использовать программное обеспечение, я хотел создать простую однострочную команду, независимую от оболочки и соответствующим образом настраивающую их среду. Таким образом, использование файла модуля кажется идеальным способом добиться этого.

Моя проблема возникает, когда я пытаюсь установить ограничение на размер дампа ядра, поскольку, похоже, нет никакого способа установить это значение из модулей. Исходная команда csh выглядит так: limit coredumpsize 0. Я понимаю, что исходный эквивалент командной строки bash: ulimit -c 0. Примечание. Обе эти команды предполагают, что я хочу отключить coredumpfiles при использовании этого программного обеспечения.

Мой код файла модуля пытается вызвать эту команду в зависимости от оболочки, потому что, похоже, не существует команды «limit», встроенной в файлы модулей.

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 и запускает одну команду, в отличие от запуска команды limit в оболочке, которая вызывает процесс модуля tcl.

Любая помощь будет очень признательна за возможность изменить переменные среды и установить предел размера дампа памяти одним простым способом, в идеале с использованием модулей.


person twinoza    schedule 10.09.2013    source источник
comment
Я бы либо преобразовал этот скрипт csh в Posix sh (или в bash), либо даже подумал об использовании GNU guile, который намного мощнее (и, ИМХО, гораздо привлекательнее), чем Tcl.   -  person Basile Starynkevitch    schedule 10.09.2013
comment
Чем поможет конвертация скрипта? Вы предлагаете мне сделать бесплатный скрипт для пользователей bash и заставить их запустить его? В нашем случае это не совсем помогло бы, потому что я также пытаюсь избавить пользователя от необходимости вводить 3-4 дополнительные команды каждый раз, когда он запускает программу. Я также стараюсь избегать того, чтобы конечный пользователь всегда редактировал свою общую среду (потому что они могли бы просто добавить изменения переменных среды в свой файл .bashrc)   -  person twinoza    schedule 11.09.2013


Ответы (2)


Вы не можете установить ограничения, запустив оболочку, потому что это ограничение повлияет только на созданный вами процесс оболочки (а не на сам процесс tcl).

Вам нужно узнать, как вызвать setrlimit(2) системный вызов напрямую. Возможно, поможет tclx.

Уделите несколько часов чтению Advanced Linux Programming.

Вы неправильно понимаете некоторые фундаментальные концепции Unix, особенно процессы.

person Basile Starynkevitch    schedule 10.09.2013
comment
Я понимаю, что не могу установить ограничения, запустив команду exec для создания нового процесса. Я поместил это в свой пример кода, чтобы рецензенты могли понять, с чего я изначально начал. С учетом сказанного я пытаюсь выяснить, есть ли какая-то переменная среды, которая управляет размером дампа памяти, которую я могу установить, ИЛИ есть ли другой способ изменить размер дампа памяти. Я не уверен, что tclx будет работать, потому что я не понимаю, как его использовать с modulecmd. Не могли бы вы предложить понимание в отношении этого? В качестве альтернативы, знаете ли вы, как сделать системный вызов из modulecmd? - person twinoza; 11.09.2013
comment
Включите TclX внутри вашего Modules; в противном случае напишите (или скопируйте) простую оболочку на C для setrlimit. Tcl с самого начала имеет возможность вызывать код C. - person Basile Starynkevitch; 11.09.2013

module оценивает в текущей запущенной оболочке то, что оценка файла модуля выдает на стандартный вывод.

Следующий файл модуля ulimit должен помочь применить заданную конфигурацию 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
person Xavier Delaruelle    schedule 23.06.2018