Проблемы запуска сервисов после перезагрузки
Диагностика и исправление проблем запуска сервисов после перезагрузки сервера: systemctl, неудачные сервисы, анализ логов загрузки и настройка systemd.
Содержание
Введение
После перезагрузки сервера некоторые сервисы могут не запуститься автоматически, что приводит к простоям. В этом руководстве рассматривается диагностика и исправление проблем запуска сервисов после перезагрузки.
Проверка неудачных сервисов
# Список всех неудачных сервисов
sudo systemctl list-units --type=service --state=failed
# Проверка статуса конкретного сервиса
sudo systemctl status ИМЯ_СЕРВИСА
# Показать все сервисы и их состояния
sudo systemctl list-units --type=service --all
Чтение логов загрузки
# Просмотр логов текущей загрузки
journalctl -b
# Просмотр логов предыдущей загрузки
journalctl -b -1
# Фильтр по сервису
journalctl -b -u ИМЯ_СЕРВИСА
# Показать только ошибки
journalctl -b -p err
# Анализ времени загрузки
systemd-analyze
# Порядок запуска сервисов
systemd-analyze blame
# Критическая цепочка
systemd-analyze critical-chain
systemd-analyze blame показывает, какие сервисы дольше всего запускались. Это помогает выявить узкие места в процессе загрузки.
Включение автозапуска сервисов
# Включить сервис при загрузке
sudo systemctl enable ИМЯ_СЕРВИСА
# Включить и запустить немедленно
sudo systemctl enable --now ИМЯ_СЕРВИСА
# Проверить, включён ли сервис
systemctl is-enabled ИМЯ_СЕРВИСА
# Список всех включённых сервисов
systemctl list-unit-files --type=service --state=enabled
Часто включаемые сервисы
sudo systemctl enable ssh
sudo systemctl enable nginx
sudo systemctl enable apache2
sudo systemctl enable mysql
sudo systemctl enable docker
sudo systemctl enable fail2ban
Зависимости сервисов
# Показать зависимости сервиса
systemctl list-dependencies ИМЯ_СЕРВИСА
# Обратные зависимости
systemctl list-dependencies --reverse ИМЯ_СЕРВИСА
# Показать unit-файл сервиса
systemctl cat ИМЯ_СЕРВИСА
Настройка зависимостей в unit-файлах
[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=: Запустить перед этими юнитами
Анализ порядка загрузки
systemd-analyze time
systemd-analyze blame | head -20
systemd-analyze critical-chain
systemd-analyze plot > boot-chart.svg
Если время загрузки слишком велико, рассмотрите отключение ненужных сервисов командой sudo systemctl disable ИМЯ_СЕРВИСА.
Создание пользовательского сервиса systemd
# /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
sudo systemctl daemon-reload
sudo systemctl enable --now myapp
sudo systemctl status myapp
Устранение распространённых проблем
Сервис завершается с кодом ошибки
journalctl -u ИМЯ_СЕРВИСА -n 50 --no-pager
systemctl cat ИМЯ_СЕРВИСА
ls -la /путь/к/бинарнику
Сервис запускается слишком рано
[Unit]
After=network-online.target
Wants=network-online.target
Сервис постоянно перезапускается
systemctl show ИМЯ_СЕРВИСА -p NRestarts
journalctl -u ИМЯ_СЕРВИСА --since "5 minutes ago"
sudo systemctl stop ИМЯ_СЕРВИСА
sudo systemctl reset-failed ИМЯ_СЕРВИСА
Заключение
Проблемы запуска сервисов после перезагрузки распространены, но легко предотвратимы. Убедитесь, что критические сервисы включены через systemctl enable, настройте правильные зависимости в unit-файлах и регулярно проверяйте логи загрузки на наличие ошибок.
Связанные статьи
Проблема SSH-подключения: не могу подключиться к серверу
Руководство по решению проблем SSH-подключения: правила файрвола Path.net, Default Block, создание правила фильтрации для SSH-порта и шаги по устранению неполадок.
Проблема RDP-подключения: не могу подключиться к Windows Server
Руководство по решению проблем RDP-подключения: правила файрвола Path.net, Default Block, создание правила фильтрации для порта RDP и шаги по устранению неполадок.
Как провести MTR-тест и отправить результаты в поддержку
Руководство по сетевому тестированию с помощью WinMTR и Linux MTR, создание правила фильтрации ICMP и отправка результатов в службу поддержки. Диагностика потери пакетов.