Что означает ошибка 'service: command not found'
Ошибка service: command not found (или bash: service: command not found) возникает в Linux, когда вы пытаетесь выполнить команду service, но система не может найти её в каталогах, указанных в переменной PATH. Команда service используется для управления системными службами (запуск, остановка, перезагрузка) в дистрибутивах с init-системой System V или upstart. В современных системах на базе systemd её роль часто выполняет systemctl, но service может сохраняться для обратной совместимости.
Типичный сценарий: вы вводите sudo service nginx start и получаете сообщение об ошибке вместо управления службой. Это не означает проблему с самой службой (nginx), а указывает на отсутствие утилиты service в вашей системе.
Причины возникновения
- Пакет
sysvinit-utils(или аналог) не установлен. В Debian/Ubinux командаserviceпоставляется в пакетеsysvinit-utils, который не устанавливается по умолчанию в минимальных или облачных образах. В CentOS/RHEL аналогичную функцию предоставляет пакетinitscripts. - Пакет повреждён или удалён. Если пакет был случайно удален или его файлы повреждены, команда перестаёт работать.
- Переменная
PATHне включает системные каталоги. Командаserviceобычно находится в/sbinили/usr/sbin. Если эти каталоги отсутствуют вPATH(например, в пользовательском окружении без прав администратора), shell не сможет её найти. - Система использует чисто systemd без совместимости. Некоторые современные дистрибутивы (например, fresh install Ubuntu 22.04) могут не включать
serviceпо умолчанию, предполагая использованиеsystemctl. - Ошибка в символьных ссылках. В systemd-системах
serviceчасто является символьной ссылкой наsystemctl. Если ссылка сломана, команда не работает.
Способы решения
Способ 1: Установка пакета, предоставляющего service
Это наиболее прямой способ. Установите пакет, содержащий утилиту service, для вашего дистрибутива.
Для Ubuntu/Debian:
sudo apt update
sudo apt install sysvinit-utils
Для CentOS/RHEL (версии 7 и ниже, где используется System V):
sudo yum install initscripts
Для Fedora или CentOS 8+ (с systemd): Пакет initscripts может быть доступен, но часто service уже есть. Если нет, установите sysvinit-tools (если доступен) или используйте systemctl.
После установки проверьте:
which service
Ожидаемый вывод: /usr/sbin/service или аналогичный путь. Теперь команда должна работать.
Способ 2: Использование systemctl вместо service
Если ваша система работает под управлением systemd (что вероятно для Ubuntu 16.04+, Debian 8+, CentOS 7+), рекомендуется использовать systemctl — более современную и функциональную альтернативу.
Примеры замены команд:
# Вместо:
sudo service nginx start
# Используйте:
sudo systemctl start nginx
# Для проверки статуса:
sudo systemctl status nginx
# Для включения автозапуска:
sudo systemctl enable nginx
systemctl поддерживает все функции service и добавляет возможности вроде управления юнитами, просмотра журналов через journalctl и зависимостей. Перейдите на systemctl, чтобы избежать проблем с отсутствием service в будущем.
Способ 3: Проверка и исправление переменной PATH
Если пакет установлен, но команда всё равно не найдена, проблема может быть в переменной PATH.
- Проверьте текущий
PATH:echo $PATH
Убедитесь, что в выводе есть/sbinи/usr/sbin. Обычно они присутствуют вPATHдля root, но могут отсутствовать для обычного пользователя. - Если каталогов нет, добавьте их в
PATHвременно:export PATH=$PATH:/usr/sbin:/sbin
Эта команда действует только в текущей сессии терминала. - Для постоянного добавления отредактируйте файл
~/.bashrc(для пользователя) или/etc/profile(для всех пользователей):nano ~/.bashrc
Добавьте строку:export PATH=$PATH:/usr/sbin:/sbin
Затем примените изменения:source ~/.bashrc - Перезапустите терминал и проверьте
which serviceснова.
Способ 4: Восстановление повреждённого пакета
Если пакет установлен, но файл service отсутствует или повреждён, переустановите его:
Для Ubuntu/Debian:
sudo apt install --reinstall sysvinit-utils
Для CentOS/RHEL:
sudo yum reinstall initscripts
После переустановки проверьте целостность файла:
ls -l /usr/sbin/service
Он должен быть исполняемым (права -rwxr-xr-x).
Профилактика
Чтобы избежать повторения ошибки service command not found:
- Устанавливайте базовые пакеты управления службами при развёртывании минимальных систем (например, в Docker-контейнерах или облачных образах). Для Debian/Ubuntu добавляйте
sysvinit-utilsв список пакетов. - Используйте
systemctlв новых проектах. Поскольку большинство современных дистрибутивов перешло на systemd, привыкайте кsystemctl— это гарантирует совместимость. - Регулярно обновляйте систему.
sudo apt update && sudo apt upgradeилиsudo yum updateпомогут избежать конфликтов пакетов. - Проверяйте
PATHпри настройке окружения. Если вы кастомизируетеPATHв~/.bashrcили/etc/environment, убедитесь, что не удаляете системные каталоги. - Для скриптов используйте полные пути. В автоматизированных скриптах вместо
serviceукажите/usr/sbin/serviceилиsystemctl, чтобы не зависеть отPATH.