chkconfig和systemd服务管理工具 init.d
chkconfig 和 systemd 都是服务管理工具;
CentOS6 中 的服务管理工具是 chkconfig;从CentOS7开始,建议使用 systemd 这个服务管理工具了;
Linux中的预设服务查看:
ls /etc/init.d/
如果你是用CentOS7~9查看的话,会发现只有几个服务,这是因为CentOS7开始不再延续chkconfig这个服务管理方案了,但是我们还是可以使用它的;
chkconfig 服务管理
service 服务名 start|stop|restart
服务名 就是 /etc/init.d/ 目录内的文件 除了上面方法操作服务,还可以:
/etc/init.d/xxx start|stop|restart
列出服务
chkconfig --list
你首先会先看到一个提示,这个提示的意思是:命令输出的内容并没有包含CentOS 8的原生systemd服务,而这里仅仅列出来SysV服务。
这也就解释了为什么 /etc/init.d/ 目录下面只有一两个启动脚本的根本原因。也就是说,早期CentOS版本(7之前)采用的服务管理都是SysV,而从7开始换成了systemd。
其次,你会发现上图中,使用chkconfig命令列出来的服务有7个运行级别(数字0~6),这为系统启动级别(CentOS 7之前版本的用法,而从CentOS 7开始已经不再严格区分级别的概念了)。
0作为shutdown动作,1作为重启至单用户模式,6为重启。在一般的Linux系统实现中,都使用了2、3、4、5几个级别。2表示无NFS支持的多用户模式,3表示完全多用户模式(也是最常用的级别),4保留给用户自定义,5表示图形登录方式。
现在我们只是看到了各服务在每个级别下的开启状态,那么如何去更改某级别下的开启状态呢?你可以:
chkconfig --level 3 服务名 off
这里用--level指定级别,然后是off或者on。选项--level后面还可以指定多个级别,如下所示:
chkconfig --level 345 服务名 off
另外还可以省略级别,默认是针对级别2、3、4和5操作的,如下所示:
chkconfig 服务名 on
chkconfig还有一个功能,就是可以把某个服务加入系统服务或者删除,即可以使用“chkconfig --add服务名”或者“chkconfig --del服务名”这样的形式,并且可以在chkconfig --list的结果中查找到。
chkconfig --del xxx chkconfig --add xxx
这个功能常用于把自定义的启动脚本加入到系统服务当中。
我们是不再建议使用 chkconfig 命令了,而是推荐使用 systemd 来管理服务;
systemd 服务管理
上面我们提到:从CentOS 7开始不使用SysV而改为systemd了,这是因为systemd支持多个服务并发启动,而SysV只能一个一个地启动,这样最终导致的结果是systemd方式启动会快很多。
列出系统中所有的服务:
systemctl lsist-units --all --type=service
上面列出的这些服务对应的文件在 /usr/lib/systemd/system/ 中:
你会发现,这目录中的这些内容,有些是文件、有的是目录,有的以.service为后缀,有的以 .target 为后缀,还有其他的格式,那么这些东西到底是什么呢?
先来了解下与服务相关知识(常用命令):
systemctl enable crond.service // 让某个服务开机启动(.service可以省略) systemctl disable crond.service // 不让开机启动 systemctl status crond.service // 查看服务状态 systemctl start crond.service // 启动某个服务 systemctl stop crond.service // 停止某个服务 systemctl restart crond.service // 重启某个服务 systemctl is-enabled crond // 查看某个服务是否开机启动
我们先来说一个很重要的概念——unit。
命令 ls /usr/lib/systemd/system 列出的文件,我们可以归类为以下几大类:
- service:系统服务。
- target:多个unit组成的组。
- device:硬件设备。
- mount:文件系统挂载点。
- automount:自动挂载点。
- path:文件或路径。
- scope:不是由systemd启动的外部进程。
- slice:进程组。
- snapshot:systemd快照。
- socket:进程间通信的套接字。
- swap:swap文件。
- timer:定时器。
以上每种类型的文件都为一个unit,正是这些unit才组成了系统的各个资源(各个服务、各个设备等)。下面给大家介绍几个和unit相关的命令:
systemctl list-units // 列出正在运行(active)的unit systemctl list-units --all // 列出所有的unit(包括失败的、inactive的) systemctl list-units --all --state=inactive // 列出所有inactive的unit systemctl list-units --all --type=service // 列出所有状态的service systemctl list-units --type=service // 列出状态为active的service systemctl is-active crond.service // 查看某个unit是否active
关于 unit 不再多解释,因为工作中几乎用不到它;
另一个概念:target。target类似于CentOS 6里面的启动级别,但target支持多个target同时启动。
target其实是多个unit的组合,系统启动说白了就是启动多个unit,为了管理方便,就使用target来管理这些unit。查看当前系统的所有 target:
systemctl list-unit-files --type=target // 注意和前面命令的区分
查看一个target包含的所有unit:
systemctl list-dependencies multi-user.target
上图是以树形的方式列出来,一目了然。下面还有几个关于target的命令:
systemctl get-default // 查看系统默认的target multi-user.target systemctl set-default multi-user.target // 设置默认的target
上面提到的multi-user.target等同于CentOS 6的运行级别3,其实还有其他几个target对应0~6运行级别,如下:
SysV运行级别
|
systemd target
|
备注
|
0
|
poweroff.target
|
关闭系统
|
1
|
rescure.target
|
单用户模式
|
2
|
multiuser.target
|
用户自定义级别,通常识别为级别3
|
3
|
multiuser.target
|
多用户,无图形
|
4
|
multiuser.target
|
用户自定义级别,通常识别为级别3
|
5
|
graphical.target
|
多用户,有图形,比级别3就多了一个图形
|
6
|
reboot.target
|
重启
|
梳理一下service、unit以及target之间的联系:
- 一个service属于一种unit;
- 多个unit一起组成了一个target;
- 一个target里面包含了多个service,你可以查看文件 /usr/lib/systemd/system/sshd.service里面[install]部分的内容,它就定义了该service属于哪一个target;