起因是在Centos 7上设置一个开机自启动脚本,查询资料时发现,linux发行版引入systemd后,导致目前网上关于服务管理方面的知识相对比较杂乱,所以在此做以整理,如有错误之处,烦请指正。
在学习Linux服务管理命令前,需要对Linux的服务有一定的了解。目前Linux服务的具体分类方式如下表:
RPM包是红帽子(Redhat)下发行版使用的软件安装包,如Centos;Deb包是Debian下发行版使用的软件安装包,如Ubuntu。
他们的安装目录
/etc | 配置文件安装目录 |
---|---|
/usr/bin | 可执行的命令安装目录 |
/usr/lib | 程序使用的函数库保存位置 |
/usr/share/doc | 基本的软件使用手册保存位置 |
/usr/share/man | 帮助文件保存位置 |
独立启动的守护进程:stand-alone,每个特定服务都有单独的守护进程,这个处理单一服务的始终存在的进程就是独立启动的守护进程。
服务始终处于后台内存中,等待被调用。可以自行启动,不需要依赖其他的管理服务。优点是客户端请求访问时,独立服务的响应更快速响应速度快,缺点是耗费资源。
目前大多数服务都是独立的服务。
超级守护进程:多个服务统一由一个进程管理,该进程可以管理多个服务。
即服务不能独立启动,必须依靠管理服务(xinetd)来调用这种服务。优点是当有客户端发起请求时,先请求xinetd服务,由xinetd服务去唤醒响应的服务,占用的资源相对较少,缺点是响应速度较慢。
目前较新的linux发行版已经很少用xinetd服务,如需使用要手动安装:
sudo yum -y install xinetd sudo apt -y install xinetd
源码包一般由用户手动下载源码,解压编译,安装在指定的位置中,一般是/usr/local/目录或/opt/目录,根据用户习惯选择。
关于软件包和源码包的具体区别此处不做赘述,想进一步了解的自行查找相关资料
在服务管理方面的区别主要是:
rpm/deb安装的服务可以用系统服务管理命令(service、systemcal、chkconfig)进行管理
源码包安装的服务一般不能被服务管理命令识别(注:有办法实现)
Linux服务启动经历过很长的一段时间发展,可以简化为三个阶段,即:
运行级别说明
运行级别 | 说明 | systemV init命令 | systemd命令 |
---|---|---|---|
0 | 关机状态,使用该级别将会关机 | init 0 | poweroff |
1 | 系统救援模式,多用于系统维护 | init 1 | systemctl isolate rescue.target |
2 | 字符界面的多用户模式(不可访问网络) | init 2 | systemctl isolate mutil-user.target |
3 | 字符界面的完整多用户模式,大多数服务器主机运行此级别 | init 3 | systemctl isolate mutil-user.target |
4 | 未分配使用 | init 4 | systemctl isolate mutil-user.target |
5 | 图形界面的多用户模式,提供了图形桌面操作环境 | init 5 | systemctl isolate graphical.target |
6 | 重新启动主机 | init 6 | reboot |
查看运行级别:
永久设置开机模式:
在非systemV init启动的Linux发行版中,没有rc.d目录。
读取inittab文件会提示:
参数 | 说明 |
---|---|
/etc/init.d/ | 服务启动脚本配置文件存放目录 |
/etc/inittab | 默认运行级别配置文件 |
/etc/init/rcS.conf | 系统初始化配置文件 |
/etc/init/rc.conf | 各运行级别初始化的配置文件 |
/etc/init/rcS-sulogin.conf | 单用户模式启动 /sbin/sushell 环境的配置文件 |
/etc/init/control-alt-delete.conf | 终端下的 ctrl+alt+del 热键操作的配置文件 |
/etc/sysconfig/init | tty终端的配置文件 |
/etc/init/start-ttys.conf | 配置tty终端的开启数量、设备文件 |
/etc/init/tty.conf 或 /etc/init/serial.conf | 控制tty终端的开启 |
/etc/init.d/独立服务名 start|stop|status|restart service 独立服务名 start|stop|status|restart chkconfig 命令: chkconfig --list [name] 服务列表[可根据实际需要,停掉不用服务] chkconfig --add [name] 服务添加[如缺省,则从缺省的init脚本自动建立] chkconfig --del [name] 服务删除[并把相关符号连接从/etc/rc[0-6].d删除] chkconfig --level name <on|off|reset> on 服务在改变运行级时的启动 off 服务在改变运行级时的停止 reset 指初始化服务信息 level 指运行级别;比如235表示运行级别为2、3、5
在 service 管理下,程序安装的时候,会自动的在 /etc/init.d 目录添加一个配置文件。当我们使用 service 控制程序时,实际是在/etc/init.d/ 配置文件中去寻找次程序的可执行文件。
比如执行开启http的服务:service apache2 start 。此时service 就会开启 /etc/init.d/apache2 配置文件里面指向的 /usr/sbin/httpd 的可执行文件。
查看这个文件发现:
基于以上问题和其他种种原因,Ubuntu的开发人员重新设计并开发了一款全新的服务管理系统,即Upstart。
UpStart采用事件驱动模型,基于事件机制。Upstart 不仅能在运行级别改变的时候启动或终止服务,也能在接收到系统发生其他改变的信息的时候启动或终止服务。这些系统的改变就是“事件”
由于Debian已经决定使用systemd,所以对于Upstart这里不做详细介绍,如果想要详细了解Upstart具体流程,可以参考: 这篇文章.
参数 | 说明 |
---|---|
/etc/systemd/system/default.target | 取代/etc/inittab文件配置,通常符号链接到 /lib/systemd/system/graphical.target |
/run/systemd/system/ | 系统执行过程中所产生的服务脚本所在目录 |
/etc/systemd/system/ | 里面存放着不同级别的开启自启服务 |
/usr/lib/systemd/system/ 和 /lib/systemd/system/ (lib是/usr/lib的软链接 ) | 每个服务最主要的启动脚本设置,类似于之前的 /etc/init.d/ |
systemctl 独立服务名 start|stop|status|restart systemd 的一些常用命令: 列出所有可用单元 : systemctl list-unit-files 列出所有运行的单元: systemctl list-unit-files | grep enabled 列出所有可用服务: systemctl list-unit-files --type=service 列出所有运行的服务: systemctl list-unit-files --type=service | grep enabled 屏蔽httpd服务:systemctl mask httpd
在 systemd管理下,程序在安装的时候,会自动的在 /usr/lib/systemd/system 目录添加一个配置文件,并将其链接到/etc/systemd/system/multi-user.target.wants中。当使用 systemctl 控制该程序时,实际是在**/etc/systemd/system/multi-user.target.wants/**配置文件中去寻找程序的可执行文件。
比如执行开启apache2服务:systemctl start apache2.service , systemctl 就会开启 apache2.service 配置里面指向的 /usr/sbin/httpd 可执行文件
可见,程序链接到lib/systemd/system下的service文件
查看apach2.service文件,其指向/usr/sbin下的可执行文件
systemd的Unit放在目录/usr/lib/systemd/system或/etc/systemd/system
.mount文件定义了一个挂载点,[Mount]节点里配置了What,Where,Type三个数据项等同于以下命令:
mount -t hugetlbfs /dev/hugepages hugetlbfs
.service文件定义了一个服务,分为[Unit],[Service],[Install]三个小节
[Unit] Description:描述, After:在network.target,auditd.service启动后才启动 ConditionPathExists: 执行条件 [Service] EnvironmentFile:变量所在文件 ExecStart: 执行启动脚本 Restart: fail时重启 [Install] Alias:服务别名 WangtedBy: 多用户模式下需要的
.target定义了一些基础的组件,供.service文件调用
.wants文件定义了要执行的文件集合,每次执行,.wants文件夹里面的文件都会执行
在/etc/xinetd.d中创建相关服务文件,如:
vim /etc/xinetd.d/telnet
重启xinetd服务
使用绝对路径,调用启动脚本启动(通常在安装软件时,可查看安装说明)
/usr/loacl/nginx/bin/nginx start|stop
注:可以通过创建软连接的方式,将启动文件链接到service或chkconfig或systemctl相关目录,从而被其识别,但一般不推荐使用,所以本文不做赘述。如有需要可自行查找资料。