Разница между systemctl и служебными командами

143

systemdдает нам systemctlнабор команд, который в основном используется для запуска служб во время загрузки. Мы также можем запускать, останавливать, перезагружать, перезапускать и проверять состояние служб с помощью systemctl.

Мы можем сделать, например, sudo systemctl enable service_nameи service_nameбудет автоматически запускаться во время загрузки. Мы также можем отключить службы, чтобы они не запускались во время загрузки.

Единственная разница между командами serviceи и может использоваться для включения запуска служб во время выполнения? Можем ли мы использовать на любом сервисе? Какие еще существенные различия есть?systemctlsystemctlsystemctl

luv.preet
источник
Я думаю, что вы выбрали неправильный ответ, сам.
Эван Кэрролл

Ответы:

144

Эта serviceкоманда представляет собой скрипт-обертку, который позволяет системным администраторам запускать, останавливать и проверять состояние служб, не слишком заботясь об используемой системе инициализации. До введения systemd это была оболочка для /etc/init.dсценариев и команды Upstart initctl, а теперь это оболочка и для этих двух, и для них systemctl.

Используйте источник, Люк!

Это проверяет на выскочку:

# Operate against system upstart, not session
unset UPSTART_SESSION
if [ -r "/etc/init/${SERVICE}.conf" ] && which initctl >/dev/null \
   && initctl version 2>/dev/null | grep -q upstart \
   && initctl status ${SERVICE} 2>/dev/null 1>/dev/null
then
   # Upstart configuration exists for this job and we're running on upstart

Если это не сработает, он ищет systemd:

if [ -d /run/systemd/system ]; then
   is_systemd=1
fi

...

# When this machine is running systemd, standard service calls are turned into
# systemctl calls.
if [ -n "$is_systemd" ]
then

И если это тоже не помогает, то возвращается к /etc/init.dсценариям System V :

run_via_sysvinit() {
   # Otherwise, use the traditional sysvinit
   if [ -x "${SERVICEDIR}/${SERVICE}" ]; then
      exec env -i LANG="$LANG" LANGUAGE="$LANGUAGE" LC_CTYPE="$LC_CTYPE" LC_NUMERIC="$LC_NUMERIC" LC_TIME="$LC_TIME" LC_COLLATE="$LC_COLLATE" LC_MONETARY="$LC_MONETARY" LC_MESSAGES="$LC_MESSAGES" LC_PAPER="$LC_PAPER" LC_NAME="$LC_NAME" LC_ADDRESS="$LC_ADDRESS" LC_TELEPHONE="$LC_TELEPHONE" LC_MEASUREMENT="$LC_MEASUREMENT" LC_IDENTIFICATION="$LC_IDENTIFICATION" LC_ALL="$LC_ALL" PATH="$PATH" TERM="$TERM" "$SERVICEDIR/$SERVICE" ${ACTION} ${OPTIONS}
   else
      echo "${SERVICE}: unrecognized service" >&2
      exit 1
   fi
}

...
run_via_sysvinit

Поскольку serviceкоманда представляет собой довольно простую оболочку, она поддерживает только ограниченный набор действий по сравнению с тем, что может обеспечить действительная система инициализации.

Для переносимости между различными версиями Ubuntu пользователи могут надежно использовать serviceкоманду для запуска, остановки, перезапуска или проверки состояния службы. Для более сложных задач, однако реальная команда используется, будь то initctlили systemctlили /etc/init.dсценарий , возможно , придется использовать напрямую.

Кроме того, будучи оболочкой, serviceскрипт в некоторых случаях также делает больше, чем может сделать прямая эквивалентная команда. Например:

  • Он всегда выполняет /etc/init.dскрипты в чистой среде. (Обратите внимание на длинный env вызов команды в run_via_sysvinitфункции выше.)
  • В restartсистемах Upstart он сопоставляется с комбинацией stop/ start, так как обычная initctl restartошибка выдаст ошибку, если служба еще не запущена.
  • Он останавливает сокеты при остановке системных служб, которые имеют связанные сокеты:

    case "${ACTION}" in
      restart|status)
         exec systemctl $sctl_args ${ACTION} ${UNIT}
      ;;
      start|stop)
         # Follow the principle of least surprise for SysV people:
         # When running "service foo stop" and foo happens to be a service that
         # has one or more .socket files, we also stop the .socket units.
         # Users who need more control will use systemctl directly.

Службы Upstart были включены непосредственно в файле конфигурации службы (или отключены с помощью переопределений), а сценарии System V были включены или отключены с помощью update-rc.dкоманды (которая управляла символическими ссылками в /etc/rc*каталогах), поэтому serviceкоманда никогда не использовалась для включения или отключения служб при загрузке. ,

Мур
источник
34
  • systemd обратно совместим с SysV.
  • загружает службы параллельно при запуске
  • обеспечивает активацию услуги по требованию
  • это основано на зависимости
  • и многое другое, я думаю ...

Есть гораздо больше того, на что вы упомянули, на что systemctlспособны.

systemd работает с юнитами, есть разные типы юнитов: цели, сервисы, сокеты и т. д. цели имеют ту же концепцию, что и уровни выполнения, они представляют собой кучу юнитов.

Вы можете использовать, systemctlчтобы установить или получить системную цель по умолчанию.

systemctl get-default

Вы можете перейти к другим целям:

systemctl isolate multiuser.target

Другие цели: многопользовательская, графическая, повторная, аварийная, перезагрузка, отключение питания.

Как вы сказали, вы можете использовать systemctlдля управления службами некоторые другие команды, связанные с управлением службами, о которых мне известно:

# Restarts a service only if it is running.
systemctl try-restart name.service

# Reloads configuration if it's possible.
systemctl reload name.service

# try to reload but if it's not possible restarts the service
systemctl reload-or-restart name.service

Вы можете использовать его, чтобы узнать о статусе услуги:

systemctl status name.service

systemctl is-active name.service # running
systemctl is-enabled name.service # will be activated when booting
systemctl is-failed name.service # failed to load

Вы можете замаскировать или снять маску на сервисе:

systemctl mask name.service
systemctl unmask name.service

Когда вы маскируете сервис, к которому он будет привязан /dev/null, другие или другие сервисы не смогут активировать / включить его вручную или автоматически. (вы должны сначала разоблачить его).

Другое использование systemctl - перечисление модулей:

systemctl list-units

Какой список всех видов единиц, загруженных и активных.

Список сервисных единиц:

systemctl list-units --type=service

Или перечислить все доступные юниты, а не только загруженные и активированные:

systemctl list-unit-files

Вы можете создавать псевдонимы или даже управлять удаленными машинами

systemctl --host ravexina@192.168.56.4 list-units

С другой стороны, serviceделает то, что должен, управляет услугами и не имеет ничего общего с бизнесом других людей;)

Ravexina
источник
1
это был идеальный ответ, есть ли что-нибудь, что serviceможет сделать, но нет systemctl?
luv.preet
Ничего, что я знаю об этом, я думаю, что просмотр страницы справочного руководства по обслуживанию был бы полезен.
Равексина
1
Есть пара очевидных различий. Синтаксис один. Другая причина в том, что системные скрипты никогда не имели дело с сокетами, насколько я знаю. Тот факт, что systemd пытается разобраться с сетевыми вещами, является еще одним фактом, и это частая точка критики. В общем, systemd пытается сделать больше, чем просто запускать сервисы
Сергей Колодяжный
Я хотел бы подать жалобу на то, что systemd скрывает сообщения журнала от неудачных service startпопыток. Pre-systemd service startпозволил бы мне сразу понять, почему мой сервис не запускается. Постсистемный, я должен посмотреть четыре или пять различных журналов, прежде чем я могу найти его. Все, что сказано, мой комментарий, несомненно, не по теме и, вероятно, будет удален.
Росс Прессер,
11
AFAICS Этот ответ, кажется, ничего не говорит о serviceкоманде, разве это не было частью вопроса?
ilkkachu