Linux系列(17)之系统服务
我们知道,在我们登陆Linux后,系统就为我们提供了很多服务,比如例行工作调度服务crond、打印服务、邮件服务等。那么这些服务是如何被启动的呢?
这个问题先放一下,接下来我们先了解一下Linux的启动过程。
1.Linux系统启动过程
启动过程分为5个阶段:内核引导、运行init进程、系统初始化、建立终端、用户登录系统。
1.内核引导
当计算机打开电源以后,首先是BIOS开机自检,按照BIOS中设置的启动设备(通常是硬盘)来启动。操作系统接管硬件以后,首先读入/boot目录下的内核文件。
2.运行init
init进程是系统所有进程的起点。如果没有这个进程,系统中的任何进程都不会启动。 init进程首先会去读取配置文件。
init的任务就是运行这些daemon。
init的类型:
运行级别
3.系统初始化
在init的配置文件中调用并执行了/etc/rc.d目录下的rc.sysinit脚本文件。
主要工作是:激活交换分区、检查磁盘、加载硬件模块以及执行一些优先任务。
用户可以通过chkconfig或setup中的“system services”来设定每个运行级别中将运行哪些守护进程daemon(就是服务)。
4.建立终端
5.用户登录
有三种登录方式:命令行登录、ssh登录、图形界面登录。
2.systemd服务管理机制
在centOS7.x之后,Linux放弃了沿用多年的SystemV这个开机启动流程,改用systemd这个启动服务管理机制。
1.systemd的优点
《1》一经要求就立刻响应的on-demand启动方式:systemd服务只有一个与之搭配的指令systemctl。
《2》依daemon功能分类:systemd管理的服务非常多,为了区分各种服务的功能,systemd将每个服务定义为一个服务单位unit,并将unit归类到不同的服务类型(type)当中去。systemd将服务单位(unit)区分为service、socket、target、path、snapshot、timer等,方便管理员分类与记忆。
《3》向下兼容旧的init服务脚本。
2.systemd的配置文件放置目录
这些目录下的每一个文件代表一个服务。
服务的启动脚本配置文件:/usr/lib/systemd/system/
系统执行产生的服务脚本:/run/systemd/system/
管理员创建的执行脚本:/etc/systemd/system/
执行优先顺序:管理员创建的执行脚本 > 系统执行产生的服务脚本 > 服务的启动脚本配置文件
3.服务类型
我们可以通过这些配置文件的扩展名确定服务的类型,每一个文件代表一个服务,文件名(去掉扩展名)就是服务(进程)的名称。
4.管理服务
systemd类型的init进程只有一个指令systemctl管理服务。而在传统的systemV类型的init进程中使用多个指令管理服务,比如service、setup、chkconfig等指令来管理服务的启动、关闭、默认启动。
服务的启动分为两种类型:开机启动、“当前”启动。
这两种类型的启动是有很大区别的
通过上一小节我们知道,服务也是有很多类型的,比如有service、target等类型;而每种类型的服务使用的命令command是不一定相同。比如service服务类型的命令start/stop/restart命令不能够作为target服务类型的命令,在后面需要着重注意。
1.管理单一服务(service unit)的启动与开机启动和状态观察
由于服务也是一个进程,因此我们可以使用kill来管理这个服务,但是存在弊端,如果使用kill杀死一个服务,那么systemctl将无法继续监控该服务;因此我们这里使用systemctl来管理。
unit由两部分组成:服务名、扩展名。
服务单位unit是有类型区分的,区分的办法就是在服务后面添加格式;比如系统服务atd的unit是atd.service,比如target类型服务multi-user的unit是multi-user.target。
当我们要管理一个服务时,但是我们仅仅知道服务名(通过top查询服务名),却不知道扩展名该怎么办?
我们可以查看systemd的配置文件/usr/lib/systemd/system,通过配置文件的扩展名从而可以确定服务的扩展名。
实例1:
查看atd这个服务的状态
Loaded与Active这两行的信息非常重要,告诉我们该服务是不是开机自启,以及当前状态。
服务默认状态分类(在Loaded行的红线处显示):
daemon的默认状态除了enable和disable之外,还有其他类型:
《1》static:这个服务不可以自己启动,但是可能被其他的enable类型的服务唤醒(相依属性的服务)。
《2》mask:这个服务无论如何都不会被启动!因为已经被强制注销(非删除),可通过systemctl unmask方式改回原本状态。
服务当前状态分类(在Active行冒号后的第一个单词显示):
《1》active (running):表示正有一个或多个程序正在系统中执行。
《2》active (exited):表示仅执行一次就正常结束的服务。
《3》active (waiting):表示正在执行当中,不过还在等待其他的事情才能继续处理。
《4》inactive:表示这个服务目前没有运行。
关闭服务:
实例1.关闭chronyd.service服务
先通过systemctl status chronyd.service查看状态,如果服务未关闭,则使用systemctl stop chronyd.service关闭服务,再使用systemctl disable chronyd.service取消开机时自动启动该服务。
上述关闭有一个问题,就是如果这个服务存在属性相依的服务B,那么服务B有可能会重新唤醒这个服务。
关闭属性相依服务A的正规做法:
如果你关闭的服务A,A有个与其属性相依的服务B,这就表明这个服务A可能被属性相依的服务B自动唤醒;因此当你想要彻底关闭这个服务时,你需要将属性相依的服务B也关闭。
关闭属性相依服务A的不正规做法:
使用systemctl mask A强迫服务注销
格式:
systemctl mask unit //unit由服务名与类型扩展名组成
例如system mask atd.service
当你强迫服务注销之后,你是无法启动这个服务了,除非使用systemctl unmask atd.service取消注销。
2.通过systemctl观察系统上所有服务
上一小节讲述的是单一服务的启动、关闭、观察,以及相依服务要注销的功能。那系统上有多少服务存在呢?这就需要通过list-units与list-unit-files来观察了!详细用法如下:
格式:
systemctl //等同于systemctl list-units,列出系统上面有启动的unit
systemctl --all //列出所有的unit(包含启动的与未启动的)
systemctl list-unit-files //将所有安装的unit列出来,安装的都会在/usr/lib/systemd/system/目录下有相应的文件
其他的格式可以依上图查询。
3.通过systemctl管理不同的操作环境(target unit)
在管理操作环境之前我们需要知道系统上有哪些关于操作环境的服务呀,操作环境的服务的扩展名为target,因此我们可以使用上一小节的知识查看有哪些操作环境相关的服务。
格式:
systemctl list-unit-files --type=target //列出所有扩展名为target的服务
有两个很重要的操作环境服务:multi-user.target与graphical.target。
管理操作环境(切换、设置)
对于target类型的服务才能使用以下命令,并且target类型的服务使用service类型服务的某些命令是无效的。比如start/stop/restart。
常用的切换与设置操作环境的操作命令:
systemctl isolate graphical.target //在不重新开机的情况下立刻将Linux系统切换至图形界面模式
systemctl isolate multi-user.target //在不重新开机的情况下立刻将Linux系统切换至命令行模式
systemctl set-default multi-user.target //在下一次及以后开机启动的时候默认进入图形界面的模式
systemctl get-default //获得系统当前的登录模式(图形界面或命令行)对应服务名称
4.通过systemctl分析各服务之间的相依性
实例:
systemctl list-dependencies //列出当前操作环境(命令行或图形界面)的相依性;即显示default.target可能会唤醒哪些服务
systemctl list-dependencies multi-user.target //列出 multi-user.target为根的树形相依性;即显示multi-user.target可能会唤醒的服务
systemctl list-dependencies multi-user.target --reverse //显示multi-user.target可能会被哪些服务唤醒
实例讲解:
systemctl list-dependencies,下图显示default.target可能会唤醒哪些服务
systemctl list-dependencies multi-user.target --reverse,下图显示multi-user.target可能会被哪些服务唤醒
5.与systemd的daemon运行过程相关的目录简介
socket服务相关文件的位置:
我们知道systemd中有很多机会会使用到socket服务,因此可能会产生很多的socket文件;那如何知道这些socket文件放置在哪呢?可以使用systemctl list-sockets指令查看。
这样就很清楚的知道socket的文件放在哪了。
网络服务与端口号
指令:
cat /etc/services //查看网络服务对应的端口号
网络服务与端口号之间的关系以表格的形式被存储在/etc/services文件中。
/etc/services文件内容如下所示:显示了服务名与对应的端口号
6.网络服务
什么是网络服务? 会产生一个网络监听端口的程序称为网络服务。
网络服务默认由SELinux管理,但是我们也可以使用systemctl来管理。因此这里使用systemctl来管理网络服务。
查看系统开启了多少个网络服务:netstat
格式:
netstat -tunlp //显示当前正在进行监听的网络服务
各个选项具体的含义请参考Linux系列(16)之系统资源的观察。
关闭网络服务
格式:
systemctl stop 服务名.扩展名 //关闭某个网络服务
5.systemctl执行例行性任务
在使用比较老旧的systemV类型的init进程时,都是通过crond服务配合crontab指令来进行创建例行性调度工作的。但是现在我们的系统上使用的是更新的systemd类型的init进程,因此我们可以通过systemd服务来管理各种例行性调度的工作。
下面就来了解一下关于systemd服务中关于例行调度的内容timer。
1.timer相比crond的优缺点
优点:
缺点:systemd的timer并没有email通知功能,而crond有email通知功能。
crond例行性工作调度的最小时间单位为分钟(minute);而systemd的timer例行性工作调度的最小时间单位可以精确到秒(second)甚至毫秒(millisecond)。
6.centOS7.x的服务简要说明
1.默认启动的服务
以上服务开机就会自动启动。
2.需要手动启动的服务
有的服务不一定安装了,因此有的需要先安装。
以上服务需要自己通过systemctl指令或者service指令启动。
启动服务格式:
systemctl start 服务名 //启动服务
service start 服务名 //启动服务
7.centos7创建自定义服务
CentOS 7的服务systemctl脚本存放在:/usr/lib/systemd/,有系统(system)和用户(user)之分,需要开机不登陆就能运行的程序,存在系统服务里,即:/usr/lib/systemd/system目录下
每一个服务以.service结尾,一般会分为3部分:[Unit]、[Service]和[Install],我写的这个服务用于开机运行tomcat项目:
内容转载自:https://blog.csdn.net/gbenson/article/details/51083817
下面是tomcat开机启动实例