systemctl 和 service 命令之间的区别

systemctl 和 service 命令之间的区别

systemd为我们提供了systemctl主要用于在启动时启动服务的命令套件。我们还可以借助 来启动、停止、重新加载、重新启动和检查服务状态systemctl

例如,我们可以执行 ,sudo systemctl enable service_name并且service_name将在启动时自动启动。我们还可以禁用服务,使其不在启动时启动。

service和之间唯一的区别是可用于在运行时启用服务的启动的systemctl命令吗?我们可以在任何服务上使用吗?还有什么其他显著的区别?systemctlsystemctl

答案1

service命令是一个包装器脚本,允许系统管理员启动、停止和检查服务状态,而不必过多担心实际使用的 init 系统。在 systemd 推出之前,它是/etc/init.d脚本和 Upstartinitctl命令的包装器,现在它是这两个的包装器 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命令是一个相当简单的包装器,因此与实际的 init 系统可能提供的操作相比,它仅支持有限的操作子集。

为了便于在各个 Ubuntu 版本间移植,用户可以放心地使用该service命令来启动、停止、重启或检查服务状态。但是,对于更复杂的任务,可能必须直接使用实际使用的命令(无论是命令initctl还是systemctl脚本)。/etc/init.d

此外,作为一个包装器,该service脚本在某些情况下还比直接等效命令能做更多的事情。例如:

  • 它总是/etc/init.d在干净的环境中执行脚本。(注意长的 env上面的函数中的命令调用run_via_sysvinit。)
  • 它在 Upstart 系统上映射到/restart的组合,因为如果服务尚未运行,则会出现错误。stopstartinitctl 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命令从不参与在启动时启用或禁用服务。

答案2

除了你提到的这些,还有很多其他功能systemctl可以实现:

  • systemd 向后兼容 SysV。
  • 启动时并行加载服务
  • 它提供按需激活服务
  • 它基于依赖关系
  • 我想还有很多……

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 [email protected] list-units

另一方面,service它做它该做的事情,管理服务,与其他人的业务无关;)

相关内容