Вопрос или проблема
Мне нужно увеличить ограничение стека на Ubuntu 18.04 навсегда, так чтобы новое ограничение применялось для всех пользователей при любых обстоятельствах. Таким образом, установка с помощью ulimit -s ...
, включая в профиле Bash и подобные решения, для меня не подойдет. Я пробовал:
- Установить ограничение в
/etc/security/limits.conf
. Это не дало эффекта. Я пытался установить как жесткие, так и мягкие лимиты, для root и моего пользователя. Перезагрузил. Ничего не изменилось. - Установить
DefaultLimitSTACK=32768
в/etc/systemd/system.conf
и/etc/systemd/user.conf
. 32768 – это желаемое ограничение стека в Кб. Диспетчер окон не загружался после перезагрузки, вместо этого я попал в какое-то аварийное корневое окружение, где большинство команд также вызывали ошибки. Я интерпретировал это как установку ограничения стека на 32 Кб вместо 32 Мб, как планировалось. - Установить
DefaultLimitSTACK=33554432
в/etc/systemd/system.conf
и/etc/systemd/user.conf
. Система загружается нормально,ulimit -s
все еще показывает 8192, ничего не изменилось.
Может кто-нибудь посоветовать, как это сделать? Спасибо!
Поскольку вы спрашиваете “Мне нужно увеличить ограничение стека на Ubuntu 18.04 навсегда, так чтобы новое ограничение применялось для всех пользователей при любых обстоятельствах.”
ulimit не сработает из-за того, что согласно справочной странице ulimit: “ulimit предоставляет управление ресурсами, доступными для оболочки и процессов, запущенных ею, на системах, которые позволяют такое управление.“
Но давайте скажем, что вы имеете в виду всех пользователей для конкретной оболочки, которая была запущена на хосте. Каждый пользователь будет в первичной группе, так что почему бы не установить мягкие и жесткие лимиты для каждой первичной группы, и таким образом каждый пользователь будет охвачен.
# /etc/security/limits.conf
# Ограничить размер стека для каждой первичной группы
@group1 soft stack 10240
@group1 hard stack 32768
@group2 soft stack 10240
@group2 hard stack 32768
# сделайте это для каждой группы
Если вы хотите получить первичные группы на хосте:
# получить уникальные первичные группы
getent passwd | awk -F: '{print $4}' | sort -u | while read -r gid; do
group_name=$(getent group "$gid" | awk -F: '{print $1}')
echo "ID группы: $gid - название группы: $group_name"
done
Вы можете попробовать написать скрипт (где вы устанавливаете ulimit) в каталоге /etc/init.d/.
Синтаксис скриптов в /etc/init.d/ – https://bash.cyberciti.biz/guide//etc/init.d
Эти скрипты выполняются при включении и выключении системы [Определенная функция вызывается для старта и остановки].
Во-первых, systemd игнорирует параметры, установленные в ulimits, см. https://serverfault.com/a/678861
На моей системе Ubuntu 18 я использую стек 16 Мб и устанавливаю его в /etc/systemd:
user.conf: DefaultLimitSTACK=16777216
system.conf: DefaultLimitSTACK=16777216
- Перезагрузите систему или выйдите из сеанса, чтобы новые параметры вступили в силу. Затем вы можете использовать
ulimit -s <value>
, чтобы установить ваш стек для сеанса оболочки пользователя на или ниже DefaultLimitStack.
Кроме того, вы можете добавить ulimit -s 16384
в файл .bashrc вашего пользователя. Тогда каждый раз, когда его сеанс запускается, стек будет установлен на это желаемое значение.
Ответ или решение
Чтобы навсегда изменить лимит стека в Ubuntu 18.04 так, чтобы он учитывался для всех пользователей и во всех случаях, необходимо учесть несколько моментов, так как простые изменения в конфигурации могут не сработать.
1. Понимание лимитов стека
Лимиты стека можно установить с помощью команды ulimit
, однако они действуют только в рамках текущего сеанса оболочки и не сохраняются после перезапуска системы. Для достижения желаемого результата, необходимо изменить системные конфигурации.
2. Настройка лимитов в limits.conf
Первый шаг заключается в изменении файла /etc/security/limits.conf
. Здесь можно задать как жесткие (hard), так и мягкие (soft) лимиты для каждого пользователя или группы. Однако, если изменения в этом файле не дали результата, можно попробовать следующий подход:
# Откройте файл для редактирования
sudo nano /etc/security/limits.conf
Затем добавьте строки, подобные следующим:
* soft stack 32768
* hard stack 32768
Эти строки устанавливают лимиты стека для всех пользователей (символ *
указывает на всех пользователей).
3. Настройка через Systemd
Ubuntu 18.04 использует systemd для управления службами и системными настройками. Чтобы задать лимит стека через systemd, нужно отредактировать файлы конфигурации:
/etc/systemd/system.conf
/etc/systemd/user.conf
Откройте оба файла и добавьте или измените следующую строку:
DefaultLimitSTACK=33554432
Это значение представляет собой 32 Мб (приблизительно 33554432 килобайт).
4. Применение изменений
После внесения изменений в конфигурационные файлы, обязательно нужно перезагрузить систему или хотя бы выйти из текущей сессии и зайти вновь, чтобы изменения вступили в силу.
5. Проверка изменений
После перезагрузки системы выполните команду:
ulimit -s
Убедитесь, что отображается установленный лимит. Если процесс все еще не удается установить нужный лимит, возможно, что какая-то программа или служба переопределяет это значение.
6. Альтернативные методы
Если вышеуказанные методы не срабатывают, можно создать скрипт для /etc/init.d/
, который будет устанавливать лимит стека при запуске системы:
#!/bin/bash
ulimit -s 32768
Сохраните этот скрипт и сделайте его исполняемым:
sudo chmod +x /etc/init.d/your-script-name
Затем добавьте его в автозагрузку с помощью update-rc.d
:
sudo update-rc.d your-script-name defaults
Заключение
Изменение лимита стека в Ubuntu 18.04 может потребовать нескольких шагов, включая настройку конфигурационных файлов и тестирование. Убедитесь, что вы применили изменения в нескольких местах, чтобы гарантировать их выполнение для всех пользователей. Если проблемы все еще возникают, возможно, стоит проверить документацию для других системных конфигураций или обратиться к системному администратору для более детальной диагностики.