lenec ru

← все посты

systemctl: Failed to start lenec.service — где смотреть логи

13K

Накатил приложение на сервер, написал systemd-юнит, делаешь systemctl start lenec.service, а в ответ:

Job for lenec.service failed because the control process exited with error code.
See "systemctl status lenec.service" and "journalctl -xeu lenec.service" for details.

Сообщение — само по себе подсказка, куда смотреть. Я обычно иду по нему буквально и в 95% случаев нахожу причину за минуту. Покажу маршрут, по которому хожу, и где обычно находится корень проблемы.

Шаг 1: systemctl status

sudo systemctl status lenec.service

Покажет последние 10 строк лога юнита, статус (loaded, active, failed) и код выхода. Часто из этого уже видно:

● lenec.service - lenec app
   Loaded: loaded (/etc/systemd/system/lenec.service; enabled)
   Active: failed (Result: exit-code) since Sun 2026-05-24 12:31:10
  Process: 4583 ExecStart=/usr/bin/node /opt/lenec/dist/server.js (code=exited, status=1/FAILURE)
Main PID: 4583 (code=exited, status=1/FAILURE)

May 24 12:31:10 srv node[4583]: Error: Cannot find module '/opt/lenec/dist/server.js'

В этом примере уже всё ясно: server.js не там, где юнит ищет.

Шаг 2: journalctl — полный лог

Если в status недостаточно — иди в журнал:

sudo journalctl -xeu lenec.service

Флаги:

  • -x — добавляет объяснения для известных событий;
  • -e — переходит в конец журнала;
  • -u lenec.service — фильтрует по конкретному юниту.

Я часто хожу по логу live, пока пытаюсь стартовать сервис из другого терминала:

sudo journalctl -fu lenec.service

-f — follow, как tail -f. Удобно, когда сервис падает не сразу, а через 30 секунд.

Топ-причины «Failed to start»

1. ExecStart с неправильным путём

Указал в юните путь, который не существует, или с очепяткой:

[Service]
ExecStart=/usr/bin/node /opt/lenec/server.js  # а файл лежит в /opt/lenec/dist/server.js

В логе видишь Cannot find module или execve: No such file or directory. Проверь, что файл реально есть, и путь точный.

2. User не существует

[Service]
User=lenec
Group=lenec

Если пользователя в системе нет, юнит не стартует. journalctl покажет: Failed to determine user credentials. Создай:

sudo useradd --system --no-create-home --shell /usr/sbin/nologin lenec

3. Working directory не существует

[Service]
WorkingDirectory=/opt/lenec
# а директории нет, или у пользователя нет доступа

Симптом: Failed to chdir или Permission denied. Проверь существование и права на директорию.

4. Порты заняты

Сервис стартует, но не может занять порт 3000, потому что его держит зомби-процесс или другой сервис. Лог: EADDRINUSE. Найти и убить:

sudo ss -ltnp | grep :3000
sudo kill <pid>

5. Ошибка приложения при старте

Когда сам код приложения падает на старте — например, не находит переменную окружения или не подключается к БД. В логе будет именно сообщение из приложения.

May 24 12:34:01 srv node[4621]: Error: DATABASE_URL is required
May 24 12:34:01 srv systemd[1]: lenec.service: Main process exited, code=exited, status=1/FAILURE

Лекарство — определить переменные окружения в юните:

[Service]
Environment=NODE_ENV=production
EnvironmentFile=/etc/lenec/.env

EnvironmentFile читает файл вида KEY=value построчно. Удобно, потому что файл с секретами лежит отдельно.

6. Разрешения на сокет / файл / директорию

Service пишет логи в /var/log/lenec/app.log, а у пользователя нет прав. Симптом — EACCES в логе. Дай права:

sudo install -d -o lenec -g lenec /var/log/lenec

7. Ошибка в самом юните

Если ты только что отредактировал .service-файл, не забудь:

sudo systemctl daemon-reload

Без этого systemd работает по старой версии файла. Я наступал на это столько раз, что прописал alias sysreload="sudo systemctl daemon-reload".

Минимальный рабочий юнит, к которому я возвращаюсь

# /etc/systemd/system/lenec.service
[Unit]
Description=lenec app
After=network-online.target
Wants=network-online.target

[Service]
User=lenec
Group=lenec
WorkingDirectory=/opt/lenec
ExecStart=/usr/bin/node /opt/lenec/dist/server.js
Restart=always
RestartSec=5
Environment=NODE_ENV=production
EnvironmentFile=/etc/lenec/.env
StandardOutput=journal
StandardError=journal
SyslogIdentifier=lenec
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target

Команды управления:

sudo systemctl daemon-reload
sudo systemctl enable lenec.service
sudo systemctl start lenec.service
sudo systemctl status lenec.service

Что делать с быстрым крашем

Бывает, сервис стартует, проходит 200 миллисекунд, и крашится. Лог состоит из одной строки code=exited, status=1. Чтобы увидеть, что приложение печатало непосредственно перед смертью, можно временно запустить его руками от того же пользователя:

sudo -u lenec env $(cat /etc/lenec/.env | xargs) /usr/bin/node /opt/lenec/dist/server.js

В этом режиме все ошибки летят прямо в терминал — найдёшь причину за секунды.

Что делаю каждый раз при «Failed to start»

  • systemctl status — есть ли быстрый ответ?
  • journalctl -xeu — что в полном логе?
  • Корень проблемы: путь, права, юзер, переменные, порт?
  • Если правил юнит — daemon-reload.
  • Если совсем непонятно — запустить вручную от того же пользователя.

Большинство ошибок «Failed to start» решаются за пять минут, если не паниковать и читать логи. Они там есть, и они подробные. Главное — не пытаться запускать снова и снова, не посмотрев, что говорит journal.

Комментарии 0

  • Будьте первым, кто оставит комментарий.

Войдите, чтобы оставить комментарий.