Разница между systemctl init.d и сервисом

40

Я новичок в Linux и тестирую себя на экземпляре Amazon Lightsail (Ubuntu 16.04 LTS).

Просматривая множество руководств, с которыми я сталкивался, я вижу людей, использующих различные команды для запуска / остановки / перезапуска / перезагрузки / проверки состояния службы. Именно эти;

sudo systemctl status apache2.service
sudo /bin/systemctl status apache2.service
sudo /etc/init.d/apache2 status
sudo service apache2 status

Все вышеперечисленные команды работают.

  1. Должен ли я предпочесть одну команду другой?
  2. Если да, то почему?
  3. Есть ли другие команды, о которых мне нужно знать?

Использование init.d в Monit вызвало проблемы, когда я захотел использовать опцию состояния (статус будет состоять в том, что служба была отключена, когда она была на самом деле - перезапущена Monit). Измените код в Monit с inid.d на / bin / systemctl и исправьте его.

Кажется, что использование init.d предоставляет больше информации о том, что случилось с другими. Если мне нужно использовать одну из других команд, возможно ли, чтобы они отображали больше информации о том, что было сделано?

ubuntu@ip-172-26-12-245:~$ sudo systemctl restart pure-ftpd.service
ubuntu@ip-172-26-12-245:~$ sudo /bin/systemctl restart pure-ftpd.service
ubuntu@ip-172-26-12-245:~$ sudo /etc/init.d/pure-ftpd restart
[ ok ] Restarting pure-ftpd (via systemctl): pure-ftpd.service.
ubuntu@ip-172-26-12-245:~$ sudo service pure-ftpd restart
ubuntu@ip-172-26-12-245:~$

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

Вакас Тарик
источник
В Linux часто существует более одного способа выполнить действие. Нет ни одного, кто лучше или хуже, или прав, или не прав. Лично я использую тот, который набирает меньше всего текста. Многие из этих команд могут быть символическими ссылками или обратно совместимы, когда Ubuntu переходит на systemd.
Пантера
systemctlявляется предпочтительным синтаксисом и serviceпредоставляется в качестве обратной совместимости. /etc/init.d/pure-ftpdили аналогичные вызовы сценариев запуска / остановки напрямую.
Пантера

Ответы:

57

Для начала, есть целая история и борьба между переходом от SysVInitк SystemD. Вместо того, чтобы пытаться разбить все это в одном ответе, я отсылаю вас к некоторой авантюре Google для получения дополнительной информации об истории, а также к одной конкретной статье по этой теме:

http://www.tecmint.com/systemd-replaces-init-in-linux/

В целом, это был медленный и трудный переход. Некоторые устаревшие функции были сохранены (например, в init.dнекоторой степени). Если у вас есть возможность использовать systemctlдля управления сервисом, я рекомендую использовать его. Это предвидимое будущее для Linux, и в конечном итоге старые SysVInitметоды будут считаться устаревшими и полностью удалены.

Чтобы охватить каждого из перечисленных вами конкретно:

  1. sudo systemctl status apache2.service

Это новый SystemDподход к обслуживанию услуг. В дальнейшем приложения в Linux предназначены для использования метода systemd, а не любого другого.

  1. sudo /bin/systemctl status apache2.service

Это то же самое, что и предыдущая команда. Единственное отличие в этом случае состоит в том, что $PATHпоиск команды не зависит от переменной окружения оболочки , а выводит ее в явном виде, включая путь к команде.

  1. sudo /etc/init.d/apache2 status

Это оригинальный SysVInitметод вызова службы. Сценарии инициализации будут написаны для службы и помещены в этот каталог. Хотя этот метод все еще используется многими, serviceбыла команда, которая заменила этот метод вызова служб в SysVInit. В более новых системах есть некоторые устаревшие функции для этого SystemD, но большинство новых программ не включают это, и не все более старые сценарии инициализации приложений работают с ним.

  1. sudo service apache2 status

Это был основной инструмент, используемый в SysVInitсистемах для служб. В некоторых случаях он просто связывался со /etc/init.d/сценариями, но в других случаях он переходил к сценарию инициализации, хранящемуся в другом месте. Он должен был обеспечить более плавный переход к обработке зависимостей службы.


Наконец, вы упомянули о желании узнать, как получить больше информации из команд, поскольку некоторые предоставляют больше информации, чем другие. Это почти всегда определяется приложением и тем, как они разработали свой файл инициализации или службы. Как правило, хотя, если он завершен в молчании, он был успешным. Однако, чтобы проверить start, stopили restart, вы можете использовать statusсуб-команду , чтобы увидеть , как он делает. Вы упомянули statusнеправильную команду в старом скрипте инициализации. Это ошибка, на которую должны были бы обратить внимание разработчики приложений. Однако, поскольку сценарии инициализации становятся устаревшим методом обработки служб, они могут просто игнорировать ошибку, пока полностью не удалят параметр сценария инициализации. systemctl status должен всегда работать правильно, иначе ошибка должна регистрироваться разработчиками приложения.

TopHat
источник
Большое спасибо за ваш подробный ответ. Я также ищу в Google ответы, но этот действительно смутил меня, поэтому я разместил их здесь. Я также вижу, что sudo systemctl status apache2 работает вместо (sudo systemctl status apache2.service). Есть ли вред в вышеупомянутой части .service?
Вакас Тарик
@WaqasTariq нет проблем! Оба из них должны работать, systemctlбудут искать каталоги, в которых хранятся служебные файлы, и добавят вам «.service», если он его найдет. Так, например, если вы нажмете вкладку один раз после того, как только напишите, sudo systemctl status apache2она должна завершить его, добавив .serviceдля вас Если существует более одного файла apache2 systemctl (например, .serviceи .targetвам нужно дважды нажать вкладку, чтобы он отображал все доступные опции.
TopHat
Понял. Спасибо за ваши ответы и ваше время.
Вакас Тарик
@ WaqasTariq Добро пожаловать!
TopHat