systemd
дает нам systemctl
комплект команд, который главным образом используется, чтобы позволить сервисам запуститься во время начальной загрузки. Мы можем также запустить, остановить, перезагрузить, перезапустить и проверить состояние сервисов с помощью systemctl
.
Мы можем сделать, например, sudo systemctl enable service_name
, и service_name
автоматически запустится во время начальной загрузки. Мы можем также отключить сервисы для не запуска во время начальной загрузки.
Единственная разница между service
и systemctl
команды это systemctl
может использоваться для включения запуска сервисов во время выполнения? Мы можем использовать systemctl
на каком-либо сервисе? Что другие существенные различия там?
service
команда является сценарием обертки, который позволяет системным администраторам запускать, останавливать и проверять состояние сервисов, не вызывая беспокойство слишком много о фактической init используемой системе. До введения systemd это была обертка для /etc/init.d
сценарии и Выскочка 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
И если это перестало работать также, это отступает к 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
команда никогда не вовлекалась во включение или отключение сервисов на начальной загрузке.
Существуют намного больше, чем, что Вы упомянули это 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
делает то, что это должно сделать, руководящие услуги и не иметь никакого отношения к другому бизнесу народов ;)