Разница между Systemctl и службой

48

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

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

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

    
задан luv.preet 10.04.2017 в 23:35
источник

2 ответа

45

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

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

Он проверяет Upstart:

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

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

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

  • Он всегда выполняет скрипты /etc/init.d в чистой среде. (Обратите внимание на вызов long 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 никогда не участвовала в включении или отключении служб при загрузке.

    
ответ дан muru 11.04.2017 в 05:03
источник
19
  • systemd обратно совместим с SysV.
  • загружает службы параллельно при запуске
  • он обеспечивает активацию услуги по требованию
  • зависит от зависимостей
  • и многое другое, я думаю ...

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

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

Вы можете использовать systemctl для установки или получения системной цели по умолчанию.

systemctl get-default

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

systemctl isolate multiuser.target

Другие цели: многопользовательские, графические, выходные, аварийные, перезагружаемые, poweroff.

Как вы сказали, вы можете использовать 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 [email protected] list-units

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

    
ответ дан Ravexina 10.04.2017 в 23:53