Установить ограничение на размер ядра с помощью модулей
Я пытаюсь преобразовать сценарий csh в сценарий tcl для использования в функциональности модулей Linux. Сценарий csh изначально использовался для правильной установки переменных среды для программного пакета. Вместо того чтобы просить конечного пользователя изменить свою оболочку и запускать 3 команды каждый раз, когда он / она желает использовать программное обеспечение, я хотел создать простую однострочную команду, независимую от оболочки и соответствующим образом настраивающую среду. Таким образом, использование modulefile кажется идеальным способом для достижения этой цели.
Моя проблема возникает, когда я пытаюсь установить ограничение на размер ядра, так как, похоже, нет способа установить это значение из модулей. Исходная команда csh выглядит так, limit coredumpsize 0
, Я понимаю, что оригинальный эквивалент командной строки bash, ulimit -c 0
, Примечание. Обе эти команды предполагают, что я хочу отключить файлы coredumpfile при использовании этого программного обеспечения.
Мой код файла модуля пытается вызвать эту команду зависящим от оболочки образом, поскольку b / c не является командой "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.
Любая помощь будет высоко ценится за возможность изменения переменных среды и установки предела для coredumpsize одним простым способом, в идеале с использованием модулей.
2 ответа
Вы не можете устанавливать ограничения при запуске оболочки, потому что это ограничение повлияет только на созданный вами процесс оболочки (а не на tcl
сам процесс).
Вам нужно выяснить, как вызвать системный вызов setrlimit(2) напрямую. Возможно, tclx может помочь.
Потратьте несколько часов, чтобы прочитать http://advancedlinuxprogramming.com/.
Вы неправильно понимаете некоторые фундаментальные концепции Unix, особенно процессы.
module
вычисляет в текущей запущенной оболочке то, что производит оценка файла модуля на stdout.
Следующие ulimit
modulefile должен помочь установить применение заданной конфигурации 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