Argument list too long в службе или скрипте
Сообщение Argument list too long (номер 7, E2BIG) означает, что суммарный размер аргументов и окружения превысил предел ядра. Обычно это следствие подстановки имён файлов в каталоге с десятками тысяч файлов.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Подстановка имён файлов дала слишком много аргументов
Запись вида
rm /var/spool/app/*в скрипте разворачивается в список всех файлов. В каталоге с сотнями тысяч файлов предел исчерпывается. -
Очень большое окружение
Переменные окружения входят в тот же предел. Служба с сотнями переменных или огромным значением может упереться в него.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Предел суммарного размера аргументов и окружения.
getconf ARG_MAXПодтверждение и контекст вызова.
journalctl -u myapp.service -n 30 --no-pager | grep -i "too long"Решение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Запись вида
rm /var/spool/app/*в скрипте разворачивается в список всех файлов. В каталоге с сотнями тысяч файлов предел исчерпывается.
- Как проверить
-
Посчитайте файлы в каталоге.
ls -1 /var/spool/app | wc -l getconf ARG_MAX
- Как исправить
-
Перепишите вызов через поиск с передачей аргументов порциями — это работает при любом числе файлов.
find /var/spool/app -maxdepth 1 -type f -delete
- Почему происходит
- Переменные окружения входят в тот же предел. Служба с сотнями переменных или огромным значением может упереться в него.
- Как проверить
-
Посмотрите размер окружения службы.
systemctl show myapp.service -p Environment | wc -c
- Как исправить
- Перенесите объёмные данные в файл и передавайте путь, а не содержимое. Для секретов есть механизм учётных данных.
Пример вывода
Скрипт очистки на каталоге с сотнями тысяч файлов. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
cleanup.sh[4200]: /usr/local/bin/cleanup.sh: line 4: /bin/rm: Argument list too long
systemd[1]: cleanup.service: Main process exited, code=exited, status=1/FAILURE
Связанные ошибки
- status=127 в systemd: команда не найдена Код 127 без имени: оболочка не нашла команду. Появляется, когда ExecStart запускает скрипт или sh -c, а внутри команды нет.
- status=1/FAILURE в systemd Код 1/FAILURE означает, что программа запустилась и сама завершилась с ошибкой. Как найти настоящую причину в журнале службы.
- Bad file descriptor в журнале службы Ошибка 9 при операции с файлом: дескриптор закрыт или не тот. Разбор для служб и сокет-активации.
- Could not open file и cannot open shared object file Программа не может открыть файл или библиотеку: путь, права, отсутствующая зависимость сборки, изоляция.
- Device or resource busy при операции с файлом Ошибка 16: файл или устройство заняты. Разбор для точек монтирования, устройств и файлов конфигурации.
- Exec format error при запуске службы Ошибка формата исполняемого файла: не та архитектура, нет строки #!, повреждённый файл или попытка запустить не программу.
- File exists при создании файла или сокета Ошибка 17: объект уже существует. Разбор для сокетов, файлов блокировки и каталогов службы.
- No such file or directory в журнале службы Служба не находит файл или каталог. Разбор: путь, момент запуска, изоляция unit-файла, символические ссылки, приватный /tmp.
Источники
- execve(2): ошибка E2BIG
-
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено на каталоге с 300 тысячами файлов.