Перейти к основному содержимому
Вернуться в категорию

Проблемы запуска сервисов после перезагрузки

Диагностика и исправление проблем запуска сервисов после перезагрузки сервера: systemctl, неудачные сервисы, анализ логов загрузки и настройка systemd.

Время чтения: 11 мин Устранение неполадок
перезагрузкаsystemctlсервисзагрузказапускsystemd

Содержание

Введение

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

Проверка неудачных сервисов

hljs bash
# Список всех неудачных сервисов
sudo systemctl list-units --type=service --state=failed

# Проверка статуса конкретного сервиса
sudo systemctl status ИМЯ_СЕРВИСА

# Показать все сервисы и их состояния
sudo systemctl list-units --type=service --all

Чтение логов загрузки

hljs bash
# Просмотр логов текущей загрузки
journalctl -b

# Просмотр логов предыдущей загрузки
journalctl -b -1

# Фильтр по сервису
journalctl -b -u ИМЯ_СЕРВИСА

# Показать только ошибки
journalctl -b -p err

# Анализ времени загрузки
systemd-analyze

# Порядок запуска сервисов
systemd-analyze blame

# Критическая цепочка
systemd-analyze critical-chain

systemd-analyze blame показывает, какие сервисы дольше всего запускались. Это помогает выявить узкие места в процессе загрузки.

Включение автозапуска сервисов

hljs bash
# Включить сервис при загрузке
sudo systemctl enable ИМЯ_СЕРВИСА

# Включить и запустить немедленно
sudo systemctl enable --now ИМЯ_СЕРВИСА

# Проверить, включён ли сервис
systemctl is-enabled ИМЯ_СЕРВИСА

# Список всех включённых сервисов
systemctl list-unit-files --type=service --state=enabled

Часто включаемые сервисы

hljs bash
sudo systemctl enable ssh
sudo systemctl enable nginx
sudo systemctl enable apache2
sudo systemctl enable mysql
sudo systemctl enable docker
sudo systemctl enable fail2ban

Зависимости сервисов

hljs bash
# Показать зависимости сервиса
systemctl list-dependencies ИМЯ_СЕРВИСА

# Обратные зависимости
systemctl list-dependencies --reverse ИМЯ_СЕРВИСА

# Показать unit-файл сервиса
systemctl cat ИМЯ_СЕРВИСА

Настройка зависимостей в unit-файлах

hljs ini
[Unit]
Description=Моё приложение
After=network.target mysql.service
Requires=mysql.service
Wants=redis.service

[Service]
Type=simple
User=www-data
WorkingDirectory=/opt/myapp
ExecStart=/opt/myapp/start.sh
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target

Ключевые директивы:

  • After=: Запустить после этих юнитов
  • Requires=: Жёсткая зависимость
  • Wants=: Мягкая зависимость
  • Before=: Запустить перед этими юнитами

Анализ порядка загрузки

hljs bash
systemd-analyze time
systemd-analyze blame | head -20
systemd-analyze critical-chain
systemd-analyze plot > boot-chart.svg

Если время загрузки слишком велико, рассмотрите отключение ненужных сервисов командой sudo systemctl disable ИМЯ_СЕРВИСА.

Создание пользовательского сервиса systemd

hljs ini
# /etc/systemd/system/myapp.service
[Unit]
Description=Пользовательское приложение
After=network.target

[Service]
Type=simple
User=appuser
WorkingDirectory=/opt/myapp
ExecStart=/opt/myapp/bin/start
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target
hljs bash
sudo systemctl daemon-reload
sudo systemctl enable --now myapp
sudo systemctl status myapp

Устранение распространённых проблем

Сервис завершается с кодом ошибки

hljs bash
journalctl -u ИМЯ_СЕРВИСА -n 50 --no-pager
systemctl cat ИМЯ_СЕРВИСА
ls -la /путь/к/бинарнику

Сервис запускается слишком рано

hljs ini
[Unit]
After=network-online.target
Wants=network-online.target

Сервис постоянно перезапускается

hljs bash
systemctl show ИМЯ_СЕРВИСА -p NRestarts
journalctl -u ИМЯ_СЕРВИСА --since "5 minutes ago"
sudo systemctl stop ИМЯ_СЕРВИСА
sudo systemctl reset-failed ИМЯ_СЕРВИСА

Заключение

Проблемы запуска сервисов после перезагрузки распространены, но легко предотвратимы. Убедитесь, что критические сервисы включены через systemctl enable, настройте правильные зависимости в unit-файлах и регулярно проверяйте логи загрузки на наличие ошибок.