SystemdDoctor
служба не работает аргументы execstart кавычки

status=2/INVALIDARGUMENT в systemd

Код 2 возвращает сама программа, когда не понимает переданные аргументы. По соглашению LSB это «недопустимые или лишние аргументы». В unit-файлах он чаще всего появляется из-за кавычек и переносов строк, из-за которых программа получает не то, что написано в глазах человека.

Вероятные причины

По порядку: сверху то, что встречается чаще.

  1. Лишние кавычки вокруг аргументов

    systemd разбирает строку запуска сам и кавычки снимает по своим правилам. Запись ExecStart=/usr/bin/app "--opt=a b" даёт один аргумент с пробелом, а ExecStart=/usr/bin/app --opt="a b" — аргумент вида --opt=a b. Программа может ожидать другого.

  2. Аргумент рассчитан на оболочку

    Подстановки, звёздочки и переменные вида $HOME без оболочки не раскрываются и уходят программе как текст. Она справедливо считает такой аргумент недопустимым.

  3. Ошибка в файле настроек, а не в аргументах

    Многие программы возвращают 2 и при неверной настройке: неизвестный параметр, недопустимое значение, конфликт разделов.

Диагностика

Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.

Показывает разобранную строку запуска: сразу видно, как systemd поделил аргументы.

systemctl show myapp.service -p ExecStart

Сообщение программы о том, какой аргумент ей не понравился.

journalctl -u myapp.service -n 40 --no-pager

Проверка ожидаемого набора ключей у той версии программы, что установлена.

sudo -u app /usr/local/bin/myapp --help | head -20

Решение

Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.

1. Лишние кавычки вокруг аргументов
Почему происходит
systemd разбирает строку запуска сам и кавычки снимает по своим правилам. Запись ExecStart=/usr/bin/app "--opt=a b" даёт один аргумент с пробелом, а ExecStart=/usr/bin/app --opt="a b" — аргумент вида --opt=a b. Программа может ожидать другого.
Как проверить
Посмотрите, как systemd разобрал строку: в systemctl show аргументы видны по отдельности.
systemctl show myapp.service -p ExecStart
Как исправить
Убирайте кавычки там, где нет пробелов, и проверяйте разбор через systemctl show. Для длинных строк используйте переносы с обратной косой.
2. Аргумент рассчитан на оболочку
Почему происходит
Подстановки, звёздочки и переменные вида $HOME без оболочки не раскрываются и уходят программе как текст. Она справедливо считает такой аргумент недопустимым.
Как проверить
Поищите в строке запуска символы оболочки.
systemctl cat myapp.service | grep -nE "\*|\$|~"
Как исправить
Передавайте готовые значения или вызывайте оболочку явно: ExecStart=/bin/sh -c '...'.
3. Ошибка в файле настроек, а не в аргументах
Почему происходит
Многие программы возвращают 2 и при неверной настройке: неизвестный параметр, недопустимое значение, конфликт разделов.
Как проверить
Запустите встроенную проверку настроек, если она есть, и посмотрите журнал.
journalctl -u myapp.service -n 40 --no-pager
Как исправить
Исправьте настройку по сообщению программы: код 2 сам ничего не уточняет.

Пример вывода

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

× myapp.service - My application
     Active: failed (Result: exit-code) since Mon 2026-09-15 11:20:12 MSK; 1s ago
    Process: 8600 ExecStart=/usr/local/bin/myapp --listen "127.0.0.1:8080" (code=exited, status=2/INVALIDARGUMENT)

myapp[8600]: error: invalid value for --listen: "127.0.0.1:8080"
systemd[1]: myapp.service: Main process exited, code=exited, status=2/INVALIDARGUMENT

Связанные ошибки

Источники

  • systemd.exec(5)
    Класс LSB: код 2 — недопустимые или лишние аргументы.
    официальная документация, systemd 255
    сверено 15 сентября 2026
  • systemd.service(5)
    Правила разбора строки запуска и кавычек в Exec*=.
    официальная документация, systemd 255
    сверено 15 сентября 2026
  • Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
    Воспроизведено на unit с кавычками вокруг значения ключа.
    собственная проверка, systemd 255
    сверено 15 сентября 2026