Почему ulimit -n не работает при вызове внутри скрипта?

738
John Miller

Это очень странно. Я пытаюсь установить ulimitс 60000помощью моего startup.sh:

#!/bin/bash  ulimit -n 60000 echo "Hello! File Descriptor set" 

Я могу выполнить это с ./startup.sh(755 прав доступа к файлу), и выводится строка эха, а ошибки не отображаются. Тем не менее, когда я делаю ulimit -nэто все еще показывает 1024, что происходит?

То, что я также нахожу захватывающим, я могу набрать ulimit -n 60000в терминале, а затем сделать, ulimit -nи это работает отлично. Почему я не могу установить ограничение дескриптора файла через скрипт?

Debian 8, 64-битный OpenVZ Контейнер

3

1 ответ на вопрос

3
grawity

Ограничения для каждого процесса, а не для пользователя или системы.

Команда ulimitвстроена в оболочку, поэтому она остается в том же процессе; однако скорректированное ограничение влияет только на этот процесс, а также на все, что вы из него запускаете (дочерние процессы наследуют те же ограничения).

Тем не менее, он ./startup.shработает как отдельный процесс - поэтому он успешно настраивает свои собственные пределы, но это волшебным образом не распространяется вверх до его родителя.

(Это та же самая ситуация, что и с cdили `export - хотя вы можете использовать их в сценарии, они все изменяют параметры самого процесса сценария, а не всей системы, и будут забыты после завершения процесса сценария.)

Примечание: есть другая команда, prlimitкоторая позволяет вам настроить ограничения ресурсов другого процесса (заданного PID). Сценарий может изменить ограничение файла своего родительского процесса следующим образом:

prlimit --pid=$PPID --nofile=4096 
Круто, спасибо за подробное объяснение. Думал, что это глобальная обстановка или что-то в этом роде John Miller 6 лет назад 0
@John Обычно самым близким к глобальному параметру параметром является `/ proc / sys / fs / file-max`. Поскольку вы находитесь внутри контейнера, OpenVZ может также применять различные ограничения, которые можно увидеть в `/ proc / user_beancounters`. grawity 6 лет назад 0
Это идеальное объяснение, спасибо! Ravi 5 лет назад 0

Похожие вопросы