Ограничивает ли «ulimit -Su» количество пользовательских процессов, созданных в подоболочках интерактивного входа в систему и созданных в нем сеансах tmux?
2150
Sam
Несколько месяцев назад я написал набор сценариев bash, использующих tmux для создания простой IDE на сервере AIX 7.1. В одном из моих скриптов есть ошибка, которая иногда генерирует пользовательские процессы очень быстро, вплоть до лимита, установленного ulimit. Это случается очень редко (примерно раз в месяц), и я уже потратил несколько безуспешных часов на отслеживание этой ошибки, поэтому я решил, что на данный момент я мог бы просто установить предел моего мягкого пользовательского процесса на что-то ниже жесткого предела ( например, 100 вместо 1024), чтобы, когда моя ошибка снова проявилась, не было заметного снижения производительности для других пользователей на сервере. К сожалению, «ulimit -Su 100» не работает в bash в AIX 7.1, но работает в ksh. Я выполнил следующий обходной путь:
Сделал ksh оболочкой по умолчанию:
$ chsh [username] /usr/bin/ksh
Написал следующее в ~ / .kshrc:
ulimit -Su 100 # works in ksh, but not in bash /bin/bash -il # start bash as an interactive login shell exit # once bash exits, exit from ksh, too
Так что теперь, каждый раз, когда я создаю оболочку, ksh устанавливает лимит мягкого пользовательского процесса и запускает bash как интерактивную оболочку входа в систему (я все еще хочу получить ~ / .bash_profile). Теперь я должен задаться вопросом, будут ли ограничения на пользовательские процессы, установленные в ksh, все еще применяться в подоболочках bash? В подоболочке bash верхнего уровня я запустил следующее:
$ ulimit -Sa core file size (blocks, -c) unlimited data seg size (kbytes, -d) unlimited file size (blocks, -f) unlimited max memory size (kbytes, -m) unlimited open files (-n) unlimited pipe size (512 bytes, -p) 64 stack size (kbytes, -s) unlimited cpu time (seconds, -t) unlimited max user processes (-u) 1024 virtual memory (kbytes, -v) unlimited
Как видите, ограничение пользовательского процесса установлено на 1024.
Еще одна важная проблема, с которой я столкнулся, это знание, будет ли ограничение, установленное в ksh, включать процессы, созданные в сеансах tmux в bash-подоболочках.
Другая деталь: всякий раз, когда я создаю новую панель в tmux, я совершенно уверен, что вызывается ksh, исходит ~ / .kshrc и запускается bash, как обычно. Я полагаю, что это так, потому что заголовок каждой вновь созданной панели tmux - «ksh» (по умолчанию заголовок панели tmux - это имя текущего процесса на переднем плане), но мне вместо приглашения отображается приглашение bash Кш подскажите.
Это слишком много, поэтому, я полагаю, я опущу дальнейшие детали, если только об этом не попросят.
Редактировать 1: Странное поведение
Посмотрите, что происходит, когда я пытаюсь получить лимит пользовательского процесса с помощью "ulimit -Su" (без аргументов), с использованием фермы и без нее:
Может быть, я использую инструмент неправильно, но это выглядит довольно странно. Эти команды выполнялись внутри tmux.
Изменить 2: Дополнительная информация
Эти команды запускались из обычной командной строки bash - без подоболочек или tmux.
$ truss ksh -c "ulimit -Su 100" 2>&1 | grep limit getrlimit64(9, 0x2FF1B988) = 0 setrlimit64(9, 0x2FF1B988) = 0 $ truss bash -c "ulimit -Su 100" 2>&1 | grep limit appulimit(1005, 0) = 0x2001C000 bash: line 0: ulimit: max user processes: cannot modify limit: A system call received a parameter that is not valid.
Ограничения ulimit обычно обрабатываются ядром, поэтому кажется, что ulimit -Su работает с различными фактическими ограничениями ядра в ksh против vash. Не могли бы вы проверить [`setrlimit ()`] (http://publib.boulder.ibm.com/infocenter/pseries/v5r3/index.jsp?topic=/com.ibm.aix.basetechref/doc/basetrf1/getrlimit_64. htm) звонки в обоих случаях с использованием [`truss`] (http://www.ibm.com/developerworks/aix/tutorials/au-apptracing/section3.html)?
pabouk 10 лет назад
0
Я принял ваше предложение и теперь у меня есть четыре разных журнала от запуска `truss -u libc.a :: setrlimit ulimit -Su 100 2> | truss.out` из различных оболочек (bash, ksh, bash tmux и ksh tmux). Какую конкретную информацию я должен публиковать? Каждый файл имеет длину около 150 строк, и я не знаю, что искать.
Sam 10 лет назад
0
Действительно ли "ферма" что-то сделала? `ulimit` не должен быть исполняемым (это встроенная оболочка), поэтому truss ulimit должен завершиться ошибкой. Что пишет "какой улит"? --- Вместо этого вы должны выполнить: `truss ksh -c" ulimit -Su 100 "` и то же самое для `bash`. Более надежным может быть перехват системных вызовов вместо [библиотечного вызова] (http://publib.boulder.ibm.com/infocenter/pseries/v5r3/index.jsp?topic=/com.ibm.aix.basetechref/doc/ basetrf1 / getrlimit_64.htm) (`-u`). Я бы попробовал `truss ... 2> & 1 | grep limit` первый.
pabouk 10 лет назад
0
Я не фанат "который" по разным причинам, в том числе обсуждаемым [здесь] (http://stackoverflow.com/questions/592620/how-to-check-if-a-program-exists-from-a -bash-script), но `which truss` дает` / usr / bin / ulimit`. С другой стороны, `тип ulimit` дает` ulimit - встроенная оболочка`. Кроме того, замена `ulimit` на` env ulimit` в команде `truss` будет работать, но даст немного другой результат. Я отредактирую свой вопрос с результатами ваших дополнительных предложенных действий.
Sam 10 лет назад
0
1 ответ на вопрос
3
pabouk
Введение в лимит ресурсов
Ограничения ресурсов в Unix-подобных системах контролируются getrlimit()и setrlimit()системными вызовами. Эти ограничения настраиваются для каждого процесса и наследуются при появлении нового процесса (например, с помощью fork()). Это означает, что если вы хотите установить ограничение в оболочке, команда должна быть встроена в оболочку (не выполняться как дочерний процесс). Действительно ulimitвстроен во многие оболочки, в том числе kshи bash.
Наблюдаемое поведение
«Встроенная» природа ulimitобъясняет различное поведение в kshи bash.
Ограничение на количество пользовательских процессов ( ulimit -u) устанавливается setrlimit(RLIMIT_NPROC, ...)syscall. В старых версиях AIX RLIMIT_NPROC не поддерживался. <1> Поддержка была добавлена в AIX 6.1 <2, раздел 5.4.4 Внедренные изменения>, так что ulimitin kshиспользует setrlimit64()правильно. bash, Вероятно, составлено, чтобы быть совместимыми с более старой версией AIX и не в состоянии контролировать этот предел.
Заключение
Вы можете использовать ulimitвстроенную команду from, kshи все дочерние процессы будут наследовать настроенные ограничения. Оболочки и процессы в целом не имеют ничего общего с обеспечением и сохранением ограничений на ресурсы, если они не вызывают явно setrlimit().
альтернатива
В AIX также есть альтернатива, которая должна работать и в более старых версиях AIX:
Спасибо за объяснение! Как только я получу немного больше репутации на этом сайте, я обязательно дам этому ответу заслуженное одобрение :)
Sam 10 лет назад
0