systemctl: Failed to start lenec.service — где смотреть логи
Накатил приложение на сервер, написал 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 lenec3. 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/.envEnvironmentFile читает файл вида KEY=value построчно. Удобно, потому что файл с секретами лежит отдельно.
6. Разрешения на сокет / файл / директорию
Service пишет логи в /var/log/lenec/app.log, а у пользователя нет прав. Симптом — EACCES в логе. Дай права:
sudo install -d -o lenec -g lenec /var/log/lenec7. Ошибка в самом юните
Если ты только что отредактировал .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.