Различие между systemctl и сервисными командами

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

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

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

148
задан 24 December 2018 в 15:57

2 ответа

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

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

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

# 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

И если это перестало работать также, это отступает к System V /etc/init.d сценарии:

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 команда является довольно простой оберткой, она только поддерживает ограниченное подмножество действий по сравнению с тем, что могла бы обеспечить фактическая init система.

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

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

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

    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.
    

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

148
ответ дан 22 November 2019 в 22:51
  • systemd назад совместим с SysV.
  • услуги по загрузкам параллельны при запуске
  • это, обеспечивает активацию по запросу сервиса
  • это - базирующаяся зависимость
  • и намного больше я предполагаю...

Существуют намного больше, чем, что Вы упомянули это systemctl способно к.

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

Можно использовать 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 делает то, что это должно сделать, руководящие услуги и не иметь никакого отношения к другому бизнесу народов ;)

34
ответ дан 22 November 2019 в 22:51

Другие вопросы по тегам:

Похожие вопросы: