Зачем управлять службами вручную
В современных версиях Ubuntu за все фоновые процессы отвечает systemd. Умение управлять службами напрямую влияет на безопасность сервера, потребление ресурсов и скорость загрузки системы. После выполнения этого руководства вы сможете останавливать зависшие демоны, оптимизировать список автозагрузки и разворачивать собственные приложения как системные сервисы без сторонних скриптов инициализации.
Подготовка и требования
Перед началом убедитесь, что у вас есть доступ к терминалу с правами обычного пользователя. Большинство операций с systemd требуют привилегий суперпользователя, поэтому команды будут выполняться с префиксом sudo. Гайд полностью совместим с Ubuntu 20.04, 22.04 и 24.04, где systemctl является стандартным менеджером инициализации. Откройте терминал (Ctrl+Alt+T) или подключитесь по SSH.
Шаг 1: Мониторинг и диагностика процессов
Прежде чем вмешиваться в работу системы, оцените текущее состояние. Вывести подробную информацию о конкретной службе (например, ssh) поможет команда:
sudo systemctl status ssh
В ответе вы увидите поле Active: active (running) или failed. Для поиска проблем используйте журналы конкретной службы:
journalctl -u ssh --since "1 hour ago"
Чтобы получить полный список загруженных юнитов и отфильтровать только работающие:
systemctl list-units --type=service --state=running
Шаг 2: Базовое управление состоянием
Если служба зависла или требует сброса конфигурации, примените одну из стандартных команд:
sudo systemctl start nginx— мгновенный запуск процесса.sudo systemctl stop nginx— корректная остановка (отправляет сигналSIGTERM).sudo systemctl restart nginx— последовательная остановка и запуск (полезно после правки конфигов).sudo systemctl reload nginx— перечитывает конфигурацию без обрыва текущих подключений.
💡 Совет: Всегда используйте
reloadвместоrestartдля веб-серверов и баз данных, если изменения в конфигах позволяют это. Это сохранит активные сессии пользователей и снизит простой.
Шаг 3: Настройка автозагрузки
По умолчанию многие службы включены при установке, но вы можете управлять их поведением при старте системы.
- Включить автозапуск:
sudo systemctl enable nginx - Отключить автозапуск:
sudo systemctl disable nginx - Полностью заблокировать запуск вручную и автоматически:
sudo systemctl mask nginx
Проверить статус автозагрузки можно через systemctl is-enabled nginx. Если команда вернула enabled, юнит будет стартовать вместе с ОС. Для временного отключения службы только на текущую сессию используйте sudo systemctl mask --runtime nginx.
Шаг 4: Создание собственного сервиса
Чтобы ваше приложение запускалось в фоне и восстанавливалось после краха, создайте юнит-файл. Откройте редактор:
sudo nano /etc/systemd/system/myapp.service
Вставьте базовую структуру:
[Unit]
Description=Мое кастомное приложение
After=network.target
[Service]
User=myuser
Group=mygroup
WorkingDirectory=/opt/myapp
ExecStart=/usr/bin/python3 /opt/myapp/main.py
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
Здесь Restart=always гарантирует, что systemd автоматически перезапустит процесс при падении. After=network.target указывает, что сервис должен стартовать только после инициализации сетевого стека. После сохранения примените изменения:
sudo systemctl daemon-reload
Затем активируйте и запустите его одной командой:
sudo systemctl enable --now myapp
Проверка результата
Убедитесь, что сервис работает штатно. Выполните:
systemctl list-units --type=service | grep myapp
Статус должен быть active. Дополнительно проверьте логи на наличие ошибок запуска:
sudo journalctl -u myapp -e
Если в логах нет строк с ERROR или FATAL, а процесс занимает ресурсы только при реальной нагрузке, настройка завершена успешно.
Возможные проблемы
Ошибка Failed to execute operation: No such file or directory
Обычно возникает при попытке включить несуществующий юнит. Проверьте опечатки в названии и убедитесь, что файл лежит именно в /etc/systemd/system/. После добавления или удаления файлов всегда запускайте sudo systemctl daemon-reload.
Служба не останавливается (Job for ... canceled)
Процесс мог игнорировать сигнал завершения. Принудительно завершите его командой sudo systemctl kill --signal=SIGKILL имя_службы, а затем выполните stop. Проверьте код возврата приложения или обновите его, так как корректные демоны должны обрабатывать SIGTERM.
Ошибка доступа к файлам в WorkingDirectory
Если в логах видны Permission denied, убедитесь, что пользователь, указанный в User= в секции [Service], имеет права на чтение и выполнение файлов в рабочей директории. Исправить можно через sudo chown -R myuser:mygroup /opt/myapp и sudo chmod -R 750 /opt/myapp.