注意:文章的背景是
CentOS Linux 7
。
什么是systemd service
service
是systemd
下的一种配置单元文件,以.service
结尾,是systemd
下最常用的,也是最重要的配置单元,可以省略其.service
结尾,例如:
lua
systemctl status sshd
和下面的语句是同一个意思
lua
systemctl status sshd.service
此前写过相关文章,但是很多东西融在一块,很难理清楚,这篇文章,单独来详细介绍一下service
。
早些版本使用SysV init
和Upstart
进行管理任务脚本,其目录为: /etc/rc.d/init.d
,这就包括我们熟知的centos 5/6
系统。
但是在centos 7
中,这些已经被systemd
替代,但是还是兼容SysV init
管理风格的,例如,在centos 7
下有一个服务是network
,其脚本路径就是在/etc/rc.d/init.d/network
下,但是也可以被systemd
管理,图示如下:

从上面截图中可以看到,loaded
的配置脚本是/etc/rc.d/init.d/network
,而非是以.service
结尾的。
同时,也可以使用service
和直接调用命令的方式来查看状态,例如:
shell
# service network status
# /etc/rc.d/init.d/network status
执行结果如下:

服务操作命令对比
在SysV init
管理的服务中,我们熟知的2个命令是,service
和chkconfig
,前则用于启动、停止、重启服务,而后则可以直接操作服务的状态,例如 设置服务开机自启,禁用服务等等。
关于systemctl
和service
命令对比如下,可以查看如下表格,指的注意的是,使用systemctl
操作unit
的时候,若不跟类型,则默认类型为service
,如下表,systemctl
栏位中的name
全名应当为name.service
,chkconfig
和 systemctl
对比亦然。
描述 | systemctl |
service |
---|---|---|
启动服务 | systemctl start name | service name start |
停止服务 | systemctl stop name | service name stop |
重启服务 | systemctl restart name | service name restart |
查看服务状态 | systemctl status name | service name status |
重载配置 | systemctl reload name | service name reload |
仅在运行时重启服务 | systemctl try-restart name | service name condrestart |
列出所有服务 | systemctl list-units --type service --all | service --status-all |
而chkconfig
和systemctl
命令对比如下:
描述 | systemctl |
chkconfig |
---|---|---|
开启服务开机自启 | systemctl enable name | chkconfig name on |
禁止服务开机自启 | systemctl disable name | chkconfig name off |
检查服务是否开机自启 | systemctl is-enable name | chkconfig --list name |
熟悉chkcoinfig
命令的同学应该知道,chkconfig
允许在运行级别上开启和停用服务,例如:
arduino
# chkconfig --level 35 httpd on
上面的意思是在运行界别3和5上面对httpd
设置开机自启。但是在systemd
中,本身就是模拟的运行级别,所以没有此类设置。
systemctl 服务状态信息
在centos 7
中,可以使用systemctl status name
或者service name status
的方式来获取服务状态,后则这是兼容该方式而已,应当使用前则。
比如,查看nginx
的服务状态,可以使用如下命令:
arduino
# systemctl status nginx
或者
arduino
# service nginx status
运行结果截图如下:

可以看到,当service
调用查看其nginx
的状态的时候,其实是重定向到命令: /bin/systemctl status nginx.service
,本质上还是执行desystemd
,这是因为centos 7
兼容一部分service
的命令,作为过度,应该积极使用最新的命令。
对于运行的结果,其日志如下:
yaml
● nginx.service - The nginx HTTP and reverse proxy server
Loaded: loaded (/usr/lib/systemd/system/nginx.service; disabled; vendor preset: disabled)
Active: active (running) since Fri 2023-11-24 15:28:29 CST; 18s ago
Process: 19179 ExecStart=/usr/sbin/nginx (code=exited, status=0/SUCCESS)
Process: 19176 ExecStartPre=/usr/sbin/nginx -t (code=exited, status=0/SUCCESS)
Process: 19175 ExecStartPre=/usr/bin/rm -f /run/nginx.pid (code=exited, status=0/SUCCESS)
Main PID: 19181 (nginx)
CGroup: /system.slice/nginx.service
├─19181 nginx: master process /usr/sbin/nginx
└─19183 nginx: worker process
Nov 24 15:28:29 localhost systemd[1]: Starting The nginx HTTP and reverse proxy server...
Nov 24 15:28:29 localhost nginx[19176]: nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
Nov 24 15:28:29 localhost nginx[19176]: nginx: configuration file /etc/nginx/nginx.conf test is successful
Nov 24 15:28:29 localhost systemd[1]: Started The nginx HTTP and reverse proxy server.
首先是Loaded
,它有3个值,按照分好;
进行分割,其中每项的含义是:
-
/usr/lib/systemd/system/nginx.service
: 代表服务所读取的配置文件路径 -
disable
: 表示禁止开机自启,若为enable
则表示会开机自启动,还有一种状态是static
表示不能被单独设置为开机自启,不过允许被别的服务调用,换句话说可以作为别的服务的依赖被启动。 -
vendor preset: disabled
: 表示在首次安装时,被禁止开机自启
关于vendor preset
仅是一个提醒,由服务的管理者设置,提示服务的默认设置。你依然可以使用systemctl enable name
来设置服务的开机自启,
而后是Active
,它表示服务的运行状态,有以下类型:
active(runing)
: 表示服务正在运行active(exited)
: 表示服务已经运行完成,且已经退出,多用于一次性服务active(waiting)
: 表示服务正在等待前置条件,前置条件成功后才会运行该服务active(start)
: 表示服务正在启动中,并未启动完成active(stop)
: 表示服务停止中,并未停止完成inactice(dead)
: 表示服务未运行
而后的信息这里简单列举一下
Main Pid
: 它记录的是服务的PID
以及其服务名称
Process
: 进程的相关附加附近
CGroup
: 有关相关控制组cgroup
的附加信息
而后便是系统输出的日志,这里仅列出最近的几行而已。
除了使用systemctl status name
来查看服务允许状态外,还有如下2个命令可以协助查看:
查看服务是否已经开机自启: systemctl is-enabled name
查看服务当前是否在运行中:systemctl is-active name
使用systemctl
查看nginx
是否开机自启 和 目前的运行状态(已经提前停止nginx
服务)

systemd 如何兼容SysV init脚本
此前曾列举过,使用service
对服务进行启停的时候,当检测到是systemd
管控的,会重定向到systemctl
执行操作,例如:

对nginx
调用的每一个执行操作,都转换为了systemctl
执行,这无可厚非,但是我们若使用该service
命令重启网卡的时候,也会调用systemctl
执行吗?来看如下结果:

结果展示,它并没有调用systemctl
执行,这是因为network
服务是属于SysV init
类型的,即配置服务路径是在/etc/rc.d/init.d/network
下。
所以,systemd
在一定程度是兼容SysV init
脚本的,于是乎,我们编写了一个最简单的脚本,如下:
bash
# cat /etc/init.d/pgsql
#!/bin/bash
case "$1" in
start)
echo "start pgsql..."
;;
stop)
echo "stop pgsql..."
;;
restart)
echo "restart pgsql..."
;;
status)
echo "status pgsql..."
esac
exit 0
#
该脚本存储的路径为: /etc/init.d/pgsql
,将会获取脚本的第一个参数,而后根据判断进行相应的输出语句,编写完毕后,我们可以立即使用service
进行查看,例如:

而直接使用systemctl
查看的时候,会报错,报错如下:

这是因为未加载配置单元,使用systemctl daemon-reload
加载配置单元后,即可使用systemctl
查看状态,例如:

可以利用systemctl
执行start
和stop
来查看该状态,其执行结果如下:

注意,systemd
支持SysV init
,但是它的初衷是为了从SysV init
过度到systemd
上,而非在systemd
上使用该方式。
总结
本篇文章介绍了什么是systemd service
,以及和SysV init
相关命令做对比,最后再详细分析了一下使用systemctl
查看的服务状态,最后聊了一下systemd
如何兼容SysV init
服务脚本。
本篇文章已经在上述命令对比已经展示了如何对服务进行启动、停止、重启等,所以没有单独开段落介绍此用法。
好咯,今天就这样吧。