Встретился вот с такой проблемой. Наша Java-программулина запускает tcsh процесс и передает в него различные команды.
Все работает хорошо до того прекрасного момент, пока аргументов не становиться слишком много и Argument list too long не порадует своим появлением...
Проблема в известных ограничениях exec* методов.
Метод exec() выдает E2BIG ошибку. Вот что говорит man об этой проблеме.
E2BIG The number of bytes in the new process's argument list
is greater than the system-imposed limit of ARG_MAX
bytes. The argument list limit is sum of the size of
the argument list plus the size of the environment's
exported shell variables.
Руководствуясь этим, получаем следующие условие, которое нужно выполнять
getconf MAX_ARGS - env | wc –c (суммарное число байт, представляющих переменные окружения) >= суммарное размер всех параметров (включая пробелы?)
На практике получается, что ограничение еще немного меньше. Возможно, нужно еще учитывать нулевой параметр (путь к executable файлу), но даже с ним, получается недостача.
Вопрос собственно прост. Что еще я не учел? Хотелось бы понять точно, чтобы проблема не выплыла однажды....
Заранее спасибо.
Ограничения командной строки (Сколько максимум аргументов можно передать.)
Модератор: Модераторы разделов
-
Zeus
- Сообщения: 694
Re: Ограничения командной строки
Может если столько параметров, то передавать их как-то по-другому?
Читать из стандартного ввода, например.
Или из конфига.
Или конфиг перенаправлять в стандартный ввод.
Читать из стандартного ввода, например.
Или из конфига.
Или конфиг перенаправлять в стандартный ввод.
-
AlexanderMaltsev
- Сообщения: 6
- ОС: SUSE10
Re: Ограничения командной строки
гм... если честно не совсем понял ответа... Есть tcsh процесс, который на стандартный ввод принимает наши команды и есть утилиты (специфичные для нашего проекта), которые он должен запускать. Соответственно может получиться ситуация и иногда получается, когда параметров слишком много...
-
uptime
- Сообщения: 1661
- Статус: Drinker with computing problems
- ОС: kubuntu 8.04
Re: Ограничения командной строки
AlexanderMaltsev писал(а): ↑27.10.2008 12:28
гм... если честно не совсем понял ответа... Есть tcsh процесс, который на стандартный ввод принимает наши команды и есть утилиты (специфичные для нашего проекта), которые он должен запускать. Соответственно может получиться ситуация и иногда получается, когда параметров слишком много...
Многие консольные программы часто имеют возможность зачитывать набор параметров из файла. Имя файла при этом передаётся в командной строке. Проверьте, возможно ваши утилиты тоже имеют эту опцию.
The answer, my friend, is blowin' in the wind.
The answer is blowin' in the wind.
The answer is blowin' in the wind.
-
Zeus
- Сообщения: 694
Re: Ограничения командной строки
AlexanderMaltsev писал(а): ↑27.10.2008 12:28Есть tcsh процесс, который на стандартный ввод принимает наши команды и есть утилиты (специфичные для нашего проекта), которые он должен запускать. Соответственно может получиться ситуация и иногда получается, когда параметров слишком много...
Я не понял, кто кому передаёт параметры?
-
AlexanderMaltsev
- Сообщения: 6
- ОС: SUSE10
Re: Ограничения командной строки
Zeus писал(а): ↑27.10.2008 13:50AlexanderMaltsev писал(а): ↑27.10.2008 12:28Есть tcsh процесс, который на стандартный ввод принимает наши команды и есть утилиты (специфичные для нашего проекта), которые он должен запускать. Соответственно может получиться ситуация и иногда получается, когда параметров слишком много...
Я не понял, кто кому передаёт параметры?
Есть программа, которая создает tcsh процесс для своих нужд и передает в него команды, в общем получается тоже самое, что если бы юзер вводил все это в консоль руками. Проблема в том, что параметров бывает очень много... :
-
AlexanderMaltsev
- Сообщения: 6
- ОС: SUSE10
Re: Ограничения командной строки
uptime писал(а): ↑27.10.2008 13:10AlexanderMaltsev писал(а): ↑27.10.2008 12:28
гм... если честно не совсем понял ответа... Есть tcsh процесс, который на стандартный ввод принимает наши команды и есть утилиты (специфичные для нашего проекта), которые он должен запускать. Соответственно может получиться ситуация и иногда получается, когда параметров слишком много...
Многие консольные программы часто имеют возможность зачитывать набор параметров из файла. Имя файла при этом передаётся в командной строке. Проверьте, возможно ваши утилиты тоже имеют эту опцию.
Идея очень хорошая, но к сожалению они этой функциональности не имеют. Соответственно, единственный выход - собирать параметры и вызывать утилиту несколько раз для каждой "пачки" параметров. Естественно, в этом случае нужен четкий критерий, чтобы понять, когда параметров уже достаточно и следующий приведет к Argument list too long.
-
Zeus
- Сообщения: 694
Re: Ограничения командной строки
AlexanderMaltsev писал(а): ↑27.10.2008 14:10Есть программа, которая создает tcsh процесс для своих нужд и передает в него команды, в общем получается тоже самое, что если бы юзер вводил все это в консоль руками. Проблема в том, что параметров бывает очень много... :
Ну и подать ему на стандартный вход файл с командами.
-
AlexanderMaltsev
- Сообщения: 6
- ОС: SUSE10
Re: Ограничения командной строки
Zeus писал(а): ↑27.10.2008 17:05AlexanderMaltsev писал(а): ↑27.10.2008 14:10Есть программа, которая создает tcsh процесс для своих нужд и передает в него команды, в общем получается тоже самое, что если бы юзер вводил все это в консоль руками. Проблема в том, что параметров бывает очень много... :
Ну и подать ему на стандартный вход файл с командами.
С таким же успехом я могу запускать утилиты каждый раз с одним параметром и это 100% будет работать. Задача именно запускать с как можно большим числом параметров, т.к. это работает значительно быстрее, во много-много раз (особенность утилит). Т.е. думаю никуда не уйти от необходимости знать точные лимиты командной строки, а вернее exec функции, запускаемой внутри tcsh.
-
Zeus
- Сообщения: 694
Re: Ограничения командной строки
Я-таки не понял что всё-таки нужно?
или
?
запускать с как можно большим числом параметров,
или
тоже самое, что если бы юзер вводил все это в консоль руками.
?
-
uptime
- Сообщения: 1661
- Статус: Drinker with computing problems
- ОС: kubuntu 8.04
Re: Ограничения командной строки
AlexanderMaltsev писал(а): ↑27.10.2008 11:50E2BIG The number of bytes in the new process's argument list
is greater than the system-imposed limit of ARG_MAX
bytes. The argument list limit is sum of the size of
the argument list plus the size of the environment's
exported shell variables.
Как видно из приведенного описания, дозволенная длина списка аргументов будет также зависеть от длины списка переменных окружения, экспортируемых шеллом. Т.е. может варьировать от системы к системе.
Предлагаю возложить задачу по экспериментальному определению этой дозволенной длины на специальную утилиту, которую можно вызывать из конфигурационного скрипта вашей программы.
The answer, my friend, is blowin' in the wind.
The answer is blowin' in the wind.
The answer is blowin' in the wind.
-
AlexanderMaltsev
- Сообщения: 6
- ОС: SUSE10
Re: Ограничения командной строки
uptime писал(а): ↑27.10.2008 22:35AlexanderMaltsev писал(а): ↑27.10.2008 11:50E2BIG The number of bytes in the new process's argument list
is greater than the system-imposed limit of ARG_MAX
bytes. The argument list limit is sum of the size of
the argument list plus the size of the environment's
exported shell variables.
Как видно из приведенного описания, дозволенная длина списка аргументов будет также зависеть от длины списка переменных окружения, экспортируемых шеллом. Т.е. может варьировать от системы к системе.
Предлагаю возложить задачу по экспериментальному определению этой дозволенной длины на специальную утилиту, которую можно вызывать из конфигурационного скрипта вашей программы.
Я пробовал писать нечто подобное - беда в том, что зависимость достаточно сложная. Единственная особенность, которую мне удалось отметить - если параметр меньше 3 символов (4 байта вместе с `\0`) - его размер все равно будет выровнен до 4 байт. Еще не понятно что насчет 0 параметра, похоже что его значение нужно умножать на 3. Но это все исключительно экспериментальные данные...