Ограничения командной строки (Сколько максимум аргументов можно передать.)

Модератор: Модераторы разделов

AlexanderMaltsev
Сообщения: 6
ОС: SUSE10

Ограничения командной строки

Сообщение AlexanderMaltsev »

Встретился вот с такой проблемой. Наша 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: Ограничения командной строки

Сообщение Zeus »

Может если столько параметров, то передавать их как-то по-другому?
Читать из стандартного ввода, например.
Или из конфига.
Или конфиг перенаправлять в стандартный ввод.
Спасибо сказали:
AlexanderMaltsev
Сообщения: 6
ОС: SUSE10

Re: Ограничения командной строки

Сообщение AlexanderMaltsev »

Zeus писал(а):
27.10.2008 11:52
Может если столько параметров, то передавать их как-то по-другому?
Читать из стандартного ввода, например.
Или из конфига.
Или конфиг перенаправлять в стандартный ввод.

гм... если честно не совсем понял ответа... Есть tcsh процесс, который на стандартный ввод принимает наши команды и есть утилиты (специфичные для нашего проекта), которые он должен запускать. Соответственно может получиться ситуация и иногда получается, когда параметров слишком много...
Спасибо сказали:
Аватара пользователя
uptime
Сообщения: 1661
Статус: Drinker with computing problems
ОС: kubuntu 8.04

Re: Ограничения командной строки

Сообщение uptime »

AlexanderMaltsev писал(а):
27.10.2008 12:28
Zeus писал(а):
27.10.2008 11:52
Может если столько параметров, то передавать их как-то по-другому?
Читать из стандартного ввода, например.
Или из конфига.
Или конфиг перенаправлять в стандартный ввод.

гм... если честно не совсем понял ответа... Есть tcsh процесс, который на стандартный ввод принимает наши команды и есть утилиты (специфичные для нашего проекта), которые он должен запускать. Соответственно может получиться ситуация и иногда получается, когда параметров слишком много...


Многие консольные программы часто имеют возможность зачитывать набор параметров из файла. Имя файла при этом передаётся в командной строке. Проверьте, возможно ваши утилиты тоже имеют эту опцию.
The answer, my friend, is blowin' in the wind.
The answer is blowin' in the wind.
Спасибо сказали:
Аватара пользователя
Zeus
Сообщения: 694

Re: Ограничения командной строки

Сообщение Zeus »

AlexanderMaltsev писал(а):
27.10.2008 12:28
Есть tcsh процесс, который на стандартный ввод принимает наши команды и есть утилиты (специфичные для нашего проекта), которые он должен запускать. Соответственно может получиться ситуация и иногда получается, когда параметров слишком много...

Я не понял, кто кому передаёт параметры?
Спасибо сказали:
AlexanderMaltsev
Сообщения: 6
ОС: SUSE10

Re: Ограничения командной строки

Сообщение AlexanderMaltsev »

Zeus писал(а):
27.10.2008 13:50
AlexanderMaltsev писал(а):
27.10.2008 12:28
Есть tcsh процесс, который на стандартный ввод принимает наши команды и есть утилиты (специфичные для нашего проекта), которые он должен запускать. Соответственно может получиться ситуация и иногда получается, когда параметров слишком много...

Я не понял, кто кому передаёт параметры?

Есть программа, которая создает tcsh процесс для своих нужд и передает в него команды, в общем получается тоже самое, что если бы юзер вводил все это в консоль руками. Проблема в том, что параметров бывает очень много... : :wacko:
Спасибо сказали:
AlexanderMaltsev
Сообщения: 6
ОС: SUSE10

Re: Ограничения командной строки

Сообщение AlexanderMaltsev »

uptime писал(а):
27.10.2008 13:10
AlexanderMaltsev писал(а):
27.10.2008 12:28
Zeus писал(а):
27.10.2008 11:52
Может если столько параметров, то передавать их как-то по-другому?
Читать из стандартного ввода, например.
Или из конфига.
Или конфиг перенаправлять в стандартный ввод.

гм... если честно не совсем понял ответа... Есть tcsh процесс, который на стандартный ввод принимает наши команды и есть утилиты (специфичные для нашего проекта), которые он должен запускать. Соответственно может получиться ситуация и иногда получается, когда параметров слишком много...


Многие консольные программы часто имеют возможность зачитывать набор параметров из файла. Имя файла при этом передаётся в командной строке. Проверьте, возможно ваши утилиты тоже имеют эту опцию.

Идея очень хорошая, но к сожалению они этой функциональности не имеют. Соответственно, единственный выход - собирать параметры и вызывать утилиту несколько раз для каждой "пачки" параметров. Естественно, в этом случае нужен четкий критерий, чтобы понять, когда параметров уже достаточно и следующий приведет к Argument list too long.
Спасибо сказали:
Аватара пользователя
Zeus
Сообщения: 694

Re: Ограничения командной строки

Сообщение Zeus »

AlexanderMaltsev писал(а):
27.10.2008 14:10
Есть программа, которая создает tcsh процесс для своих нужд и передает в него команды, в общем получается тоже самое, что если бы юзер вводил все это в консоль руками. Проблема в том, что параметров бывает очень много... : :wacko:

Ну и подать ему на стандартный вход файл с командами.
Спасибо сказали:
AlexanderMaltsev
Сообщения: 6
ОС: SUSE10

Re: Ограничения командной строки

Сообщение AlexanderMaltsev »

Zeus писал(а):
27.10.2008 17:05
AlexanderMaltsev писал(а):
27.10.2008 14:10
Есть программа, которая создает tcsh процесс для своих нужд и передает в него команды, в общем получается тоже самое, что если бы юзер вводил все это в консоль руками. Проблема в том, что параметров бывает очень много... : :wacko:

Ну и подать ему на стандартный вход файл с командами.

С таким же успехом я могу запускать утилиты каждый раз с одним параметром и это 100% будет работать. Задача именно запускать с как можно большим числом параметров, т.к. это работает значительно быстрее, во много-много раз (особенность утилит). Т.е. думаю никуда не уйти от необходимости знать точные лимиты командной строки, а вернее exec функции, запускаемой внутри tcsh.
Спасибо сказали:
Аватара пользователя
Zeus
Сообщения: 694

Re: Ограничения командной строки

Сообщение Zeus »

Я-таки не понял что всё-таки нужно?
запускать с как можно большим числом параметров,


или

тоже самое, что если бы юзер вводил все это в консоль руками.

?
Спасибо сказали:
Аватара пользователя
uptime
Сообщения: 1661
Статус: Drinker with computing problems
ОС: kubuntu 8.04

Re: Ограничения командной строки

Сообщение uptime »

AlexanderMaltsev писал(а):
27.10.2008 11:50
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.

Как видно из приведенного описания, дозволенная длина списка аргументов будет также зависеть от длины списка переменных окружения, экспортируемых шеллом. Т.е. может варьировать от системы к системе.
Предлагаю возложить задачу по экспериментальному определению этой дозволенной длины на специальную утилиту, которую можно вызывать из конфигурационного скрипта вашей программы.
The answer, my friend, is blowin' in the wind.
The answer is blowin' in the wind.
Спасибо сказали:
AlexanderMaltsev
Сообщения: 6
ОС: SUSE10

Re: Ограничения командной строки

Сообщение AlexanderMaltsev »

uptime писал(а):
27.10.2008 22:35
AlexanderMaltsev писал(а):
27.10.2008 11:50
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.

Как видно из приведенного описания, дозволенная длина списка аргументов будет также зависеть от длины списка переменных окружения, экспортируемых шеллом. Т.е. может варьировать от системы к системе.
Предлагаю возложить задачу по экспериментальному определению этой дозволенной длины на специальную утилиту, которую можно вызывать из конфигурационного скрипта вашей программы.

Я пробовал писать нечто подобное - беда в том, что зависимость достаточно сложная. Единственная особенность, которую мне удалось отметить - если параметр меньше 3 символов (4 байта вместе с `\0`) - его размер все равно будет выровнен до 4 байт. Еще не понятно что насчет 0 параметра, похоже что его значение нужно умножать на 3. Но это все исключительно экспериментальные данные...
Спасибо сказали: