systemd
为我们提供了systemctl
主要用于在启动时启动服务的命令套件。我们还可以借助 来启动、停止、重新加载、重新启动和检查服务状态systemctl
。
例如,我们可以执行 ,sudo systemctl enable service_name
并且service_name
将在启动时自动启动。我们还可以禁用服务,使其不在启动时启动。
service
和之间唯一的区别是可用于在运行时启用服务的启动的systemctl
命令吗?我们可以在任何服务上使用吗?还有什么其他显著的区别?systemctl
systemctl
答案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
的组合,因为如果服务尚未运行,则会出现错误。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
命令从不参与在启动时启用或禁用服务。
答案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
它做它该做的事情,管理服务,与其他人的业务无关;)