systemd
为我们提供了systemctl
命令套件,该套件主要用于使服务在引导时启动。我们还可以借助systemctl
来启动,停止,重新加载,重新启动和检查服务状态。例如,我们可以执行sudo systemctl enable service_name
,而service_name
将在启动时自动启动。我们还可以禁用无法在引导时启动的服务。service
和systemctl
命令之间的唯一区别是systemctl
可用于在运行时启用服务启动吗?我们可以在任何服务上使用systemctl
吗?还有什么其他重大区别?#1 楼
service
命令是一个包装器脚本,它使系统管理员可以启动,停止和检查服务状态,而不必过多担心实际使用的初始化系统。在介绍systemd之前,它是/etc/init.d
脚本的包装器和Upstart的initctl
命令的包装器,现在它也是这两个和systemctl
的包装器。使用源代码Luke!
它检查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服务直接在服务配置文件中启用(或通过覆盖禁用),并且
update-rc.d
命令(在/etc/rc*
目录中管理符号链接)启用或禁用System V脚本,因此service
命令从不参与启用或禁用启动时提供服务。评论
奇怪的服务--status-all不显示我使用systemctl安装的服务...
– jjxtra
20 Sep 14 '15:25
#2 楼
systemd与SysV向后兼容。
在启动时并行加载服务
它提供按需激活服务
基于依赖的方式
我想还有很多...
systemctl
所能提供的功能远远超过您所提到的。套接字等目标与运行级别具有相同的概念,它们是一堆单元。您可以使用
systemd
设置或获取默认系统目标。systemctl get-default
您可以进入其他目标: >
正如您所说,您可以使用
systemctl
来管理服务,我知道的一些其他与服务管理相关的命令是:systemctl isolate multiuser.target
您可以使用它来了解服务状态:
# 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
,因此手动或自动其他服务无法激活/启用它。 (您应该先取消屏蔽)。systemctl的另一种用法是列出设备:
systemctl mask name.service
systemctl unmask name.service
列出所有已装载的设备并且处于活动状态。
列出服务单元:
systemctl list-units
或列出所有可用单元,而不仅仅是已加载和激活的单元:
systemctl list-units --type=service
您可以创建别名甚至控制远程计算机
systemctl list-unit-files
另一方面,
/dev/null
要做的是,管理服务,与其他人的业务无关;)评论
那是一个完美的答案,服务可以做些什么,而systemctl不能吗?
–luv.preet
17年4月10日在23:10
我没有意识到这一点,我认为看看服务手册页会有所帮助。
–Ravexina♦
17年4月10日在23:12
有几个明显的区别。语法是一种。据我所知,另一个是systemv脚本从未处理过套接字。 systemd试图处理网络类型的东西这一事实是另一个事实,这是经常批评的地方。总体而言,systemd尝试做的不仅仅是启动服务
– Sergiy Kolodyazhnyy
17年4月11日在1:28
我想在这里抱怨systemd从失败的服务启动尝试中隐藏日志消息。预先系统化的服务启动将使我立即看到为什么我的服务无法启动。后系统化后,我必须先查看四个或五个不同的日志才能找到它。综上所述,我的评论无疑是与主题无关的,可能会被删除。
–罗斯压机
17年4月11日在2:23
非洲人(AFAICS)这个答案似乎并没有说明任何有关service命令的内容,这不是问题的一部分吗?
–ilkkachu
17年4月11日在8:04
评论
我想你自己选错了答案。