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之间的联系:

  1. 一个service属于一种unit;
  2. 多个unit一起组成了一个target;
  3. 一个target里面包含了多个service,你可以查看文件 /usr/lib/systemd/system/sshd.service里面[install]部分的内容,它就定义了该service属于哪一个target;
posted @ 2022-04-06 21:48  醉马踏千秋  阅读(448)  评论(0编辑  收藏  举报