Несколько месяцев назад я написал набор сценариев 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.