То service
command - это сценарий-оболочка, который позволяет системным администраторам запускать, останавливать и проверять состояние служб, не слишком беспокоясь о фактической используемой системе инициализации. До появления systemd это была оболочка для /etc/init.d
сценарии и выскочки initctl
команда, и теперь это оболочка для этих двух и systemctl
также.
Он проверяет наличие выскочки:
# Operate against system upstart, not sessionunset UPSTART_SESSIONif [ -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/nullthen # Upstart configuration exists for this job and we're running on upstart
Если это не сработает, он ищет systemd:
if [ -d /run/systemd/system ]; then is_systemd=1fi...# When this machine is running systemd, standard service calls are turned into# systemctl calls.if [ -n "$is_systemd" ]then
И если это тоже не удастся, он вернется к системе 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
command - это довольно простая оболочка, она поддерживает только ограниченное подмножество действий по сравнению с тем, что может предоставить реальная система инициализации.
Для переносимости на различные версии 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.
Службы Upstart были включены непосредственно в файле конфигурации службы (или отключены с помощью переопределений), а сценарии System V были включены или отключены с помощью update-rc.d
команда (которая управляла символическими ссылками в /etc/rc*
каталоги), так что service
команда никогда не участвовала в включении или отключении служб при загрузке.