Ограничивает ли «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" (без аргументов), с использованием фермы и без нее:

$ truss ulimit -Su 2>| truss.out 100 $ ulimit -Su 1024 

Может быть, я использую инструмент неправильно, но это выглядит довольно странно. Эти команды выполнялись внутри 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. 
4
Ограничения 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:

chdev -l sys0 -a maxuproc=100 

Смотри: 3, 4

Спасибо за объяснение! Как только я получу немного больше репутации на этом сайте, я обязательно дам этому ответу заслуженное одобрение :) Sam 10 лет назад 0