linux rpm找不到命令_一文精通Linux系统服务管理

服务管理

什么是系统服务?服务是在后台运行的应用程序,并且可以提供一些本地系统或网络的功能。那么,Linux中常见的服务有哪些?这些服务怎么分类?服务如何启动?服务如何自启动?服务如何查看?这些就是本章需要解决的主要问题。

其实服务管理并不难,但是Linux中服务的分类比较多,而且每种服务又有多种启动和自启动方法,所以容易混淆。同时,常见网络服务的端口号也是必须掌握的基础知识。

12.1 服务的简介与分类

我们知道,系统服务是在后台运行的应用程序,并且可以提供一些本地系统或网络的功能。我们把这些应用程序称作服务,也就是Service。不过,我们有时会看到Daemon的叫法,Daemon的英文原意是“守护神”,在这里是“守护进程”的意思。那么,什么是守护进程?它和服务又有什么关系呢?守护进程就是为了实现服务功能的进程。比如,我们的apache服务就是服务(Service),它是用来实现Web服务的。那么,启动apache服务的进程是哪个进程呢?就是httpd这个守护进程(Daemon) 。也就是说,守护进程就是服务在后台运行的真实进程。

如果我们分不清服务和守护进程,那么也没有什么关系,可以把服务与守护进程等同起来。在Linux中就是通过启动httpd进程来启动apache服务的,你可以把httpd进程当作apache服务的别名来理解。

12.1.1 服务的分类和区分

  1. 服务的分类

Linux中的服务按照安装方法不同可以分为RPM包默认安装的服务和源码包安装的服务两大类。其中,RPM包默认安装的服务又因为启动与自启动管理方法不同分为独立的服务和基于xinetd的服务。服务分类的关系图如图12-1所示。

6ae8cbf33245300a28994b4003bdb6a5.png

图12-1 服务分类的关系图

我们知道,Linux中常见的软件包有两种:一种是RPM包;另一种是源码包。那么,通过RPM包安装的系统服务就是RPM包默认安装的服务(因为Linux光盘中全是RPM包,Linux系统也是通过RPM包安装的,所以我们把RPM包又叫作系统默认包),通过源码包安装的系统服务就是源码包安装的服务。

源码包是开源的,自定义性强,通过编译安装更加适合系统,但是安装速度较慢,编译时容易报错。RPM包是经过编译的软件包,安装更快速,不易报错,但不再是开源的。这些特点都是软件包本身的特点,但是软件包一旦安装到Linux系统上,它们的区别是什么呢?最主要的区别就是安装位置不同,源码包安装到我们手工指定的位置当中,而RPM包安装到系统默认位置当中(可以通过rpm -ql 包名命令查询)。也就是说,RPM包安装到系统默认位置,可以被服务管理命令识别;但是源码包安装到手工指定位置,当然就不能被服务管理命令识别了(可以手工修改为被服务管理命令识别)。所以,RPM包默认安装的服务和源码包安装的服务的管理方法不同,我们把它们当成不同的服务分类。服务分类说明如下。

  • RPM包默认安装的服务。这些服务是通过RPM包安装的,可以被服务管理命令识别。这些服务又可以分为两种。
    • 独立的服务:就是独立启动的意思,这种服务可以自行启动,而不用依赖其他的管理服务。因为不依赖其他的管理服务,所以,当客户端请求访问时,独立的服务响应请求更快速。目前,Linux中的大多数服务都是独立的服务,如apache服务、FTP服务 、Samba服务等。
    • 基于xinetd的服务:这种服务就不能独立启动了,而要依靠管理服务来调用。这个负责管理的服务就是xinetd服务。xinetd服务是系统的超级守护进程,其作用就是管理不能独立启动的服务。当有客户端请求时,先请求xinetd服务,由xinetd服务去唤醒相对应的服务。当客户端请求结束后,被唤醒的服务会关闭并释放资源。这样做的好处是只需要持续启动xinetd服务,而其他基于xinetd的服务只有在需要时才被启动,不会占用过多的服务器资源。但是这种服务由于在有客户端请求时才会被唤醒,所以响应时间相对较长。
  • 源码包安装的服务,这些服务是通过源码包安装的,所以位置都是手工指定的。由于不能被系统中的服务管理命令直接识别,所以这些服务的启动与自启动方法一般都是源码包设计好的。每个源码包的启动脚本都不一样,一般需要查看说明文档才能确定。
  1. 查询已经安装的服务和区分服务

我们已经知道Linux服务的分类了,那么应该如何区分这些服务呢?首先要区分RPM包默认安装的服务和源码包安装的服务。源码包安装的服务是不能被服务管理命令直接找到的,而且一般会安装到/usr/local/目录中。也就是说,在/usr/local/目录中的服务都应该是通过源码包安装的服务。RPM包默认安装的服务都会安装到系统默认位置,所以是可以被服务管理命令(如servicechkconfig) 识别的。

其次,在RPM包默认安装的服务中怎么区分独立的服务和基于xinetd的服务?这就要依靠chkconfig命令了。chkconfig是管理RPM包默认安装的服务的自启动的命令,这里仅利用这条命令的查看功能。使用这条命令还能看到RPM包默认安装的所有服务。命令格式如下:

# chkconfig --list [服务名]
选项说明
--list列出RPM包默认安装的所有服务的自启动状态

例如:

# chkconfig --list

这条命令的第一列为服务的名称,后面的0~6代表在不同的运行级别中这个服务是否开启时自动启动。这些服务都是独立的服务,因为它们不需要依赖其他任何服务就可以在相应的运行级别启动或自启动。但是没有看到基于xinetd的服务,那是因为系统中默认没有安装xinetd这个超级守护进程,需要我们手工安装。安装命令如下:

# yum install xinetd -y

这里需要注意的是,在Linux中基于xinetd的服务越来越少,原先很多基于xinetd的服务在新版本的Linux中已经变成了独立的服务。安装完xinetd超级守护进程之后,我们再查看一下,命令如下:

# chkconfig --list

在刚刚的独立的服务之下出现了一些基于xinetd的服务,这些服务没有自己的运行级别,因为它们不是独立的服务,到底在哪个运行级别可以自启动,则要看xinetd服务是在哪个运行级别自启动的。

12.1.2 服务和端口

  1. 端口简介

服务是给系统提供功能的,在系统中除了有系统服务,还有网络服务。而每个网络服务都有自己的端口,一般端口号都是固定的。那么,什么是端口呢?

我们知道,IP地址是计算机在互联网上的地址编号,每台联网的计算机都必须有自己的IP地址,而且必须是唯一的,这样才能正常通信。也就是说,在互联网上是通过IP地址来确定不同计算机的位置的。大家可以把IP地址想象成家庭的"门牌号码”,不管你住的是大杂院、公寓楼还是别墅,都有自己的门]牌号码,而且门牌号码是唯一的。

如果知道了一台服务器的IP地址,我们就可以找到这台服务器。但是这台服务器上有可能搭建了多个网络服务,比如WWW服务、FTP服务、Mail服务,那么我们到底需要服务器为我们提供哪个网络服务呢?这时就要靠端口(Port) 来区分了,因为每个网络服务对应的端口都是固定的。比如,WWW服务对应的端口是80,FTP服务对应的端口是20和21,Mail服务对应的端口是25和110。也就是说,IP地址可以想象成“门牌号码”,而端口可以想象成”家庭成员”,找到了IP地址只能找到你们家,只有找到了端口,寄信时才能找到真正的收件人。

为了统一整个互联网的端口和网络服务的对应关系,以便让所有的主机都能使用相同的机制来请求或提供服务,同一个服务使用相同的端口,这就是协议。计算机中的协议主要分为两大类:一类是面向连接的可靠的TCP协议(Transmission Control Protocol,传输控制协议);另一种是面向无连接的不可靠的UDP协议(User Datagram Protocol,用户数据报协议)。这两种协议都支持216,也就是65535个端口。这么多端口怎么记忆呢?系统给我们提供了服务与端口的对应文件/etc/services,查看一下:

# vim /etc/services

网络服务的端口能够修改吗?当然是可以的,不过一旦修改了端口,那么客户机在访问服务器时很难知道服务器对应的端口是什么,也就不能正确地获取服务了。所以,除非在实验环境下,否则不要修改网络服务对应的端口。

  1. 查询系统中已经启动的服务

既然每个网络服务对应的端口是固定的,那么是否可以通过查询服务器中开启的端口,来判断当前服务器开启了哪些服务?当然是可以的。虽然判断服务器中开启的服务还有其他方法(如通过ps 命令),但是通过端口的方法查看最为准确,命令为netstat命令。

12.2 RPM包默认安装的服务管理

我们先来讲解RPM包默认安装的服务如何管理,这里的管理主要指的是启动管理和自启动管理。启动很好理解,就是在当前系统中让服务运行,并提供功能。自启动是指在系统开机或重新启动之后,随着系统的启动而自动启动服务。

我们一直说RPM包默认安装的服务和源码包安装的服务最主要的区别就是程序的安装位置不同。源码包安装的服务安装到了用户的指定位置,那么RPM包默认安装的服务到底安装到了哪里呢?这些位置是固定的,我们分别来看。

  • /etc/init.d/:RPM包默认安装的服务中所有独立服务的启动脚本都放置在这里。在/etc/rc.d/init.d/目录中放置的也是独立服务的启动脚本,这两个目录中的脚本文件是软链接,所以使用哪一个都可以。
  • etc/sysconfig/:这个目录用于放置RPM包默认安装的服务的初始化环境配置文件。服务会把自己在初始化过程中的一些参数设置写入这个目录中的文件。
  • /etc/:这个目录用于放置RPM包默认安装的服务的配置文件。注意:源码包安装的服务的配置文件不在这里,而在源码包的安装目录中(源码包安装的服务的所有相关文件都在自己指定的安装目录中,所以删除源码包时可以直接删除安装目录)。
  • /etc/xinetd.conf:超级守护进程xinetd的配置文件。这个文件基本不需要修改,因为xinetd进程是用来调用其他依赖它的服务的。
  • /etc/xinetd.d/:这个目录中的文件就是基于xinetd服务的启动脚本。我们如果想要启动基于xinetd的服务,则需要修改这个目录中的文件。
  • /var/lib/:RPM包默认安装的服务如果产生了数据,就会把数据记录在这个目录中。如RPM包默认安装的mysq|服务的数据库会存放在/var/lib/mysq/目录中。
  • /var/log/:RPM包默认安装的服务的日志都会放置在这个目录中。如/var/log/httpd/目录就用于保存默认安装的httpd服务的日志。

RPM包默认安装的服务的主要安装位置就是这些,某些服务可能会有一些特殊文件没有安装到这里,如默认安装的apache服务的网页主目录是/var/www/htm/,这些特殊文件在学到时再具体对待。

12.2.1 独立服务的管理

我们知道RPM包默认安装的服务分为独立的服务和基于xinetd的服务,本小节先来学习一下独立服务的管理。

  1. 独立服务的启动管理

独立的服务要想启动,主要有两种方法。

1)使用/etc/init.d/目录中的启动脚本来启动独立的服务

既然所有独立服务的启动脚本都存放在/etc/init.d/目录中,那么,调用这些脚本就可以启动独立的服务了。这种启动方式是推荐启动方式,命令格式如下:

# /etc/init.d/独立服务名 start|stop|status|restart|...
参数说明
start启动服务
stop停止服务
status查看服务状态
restart重启动服务

我们以启动RPM包默认安装的httpd服务为例,命令如下:

# /etc/init.d/httpd start

2)使用service命令来启动独立的服务

在CentOS系统中,我们还可以依赖service命令来启动独立的服务。service命令实际 上只是一个脚本,这个脚本仍然需要调用/etc/init.d/中的启动脚本来启动独立的服务。而且service命令是红帽系列Linux的专有命令,其他的Linux发行版本并不一定拥有这条命令,所以我们并不推荐使用service命令来启动独立的服务。命令格式如下:

# service httpd start|stop|status|restart|...

例如:

# service httpd start

命令比输入/etc/init.d/目录要稍微简单。service命令还可以查看所有独立服务的启动状态,这是一个常用功能,命令格式如下:

# service --status-all
选项说明
--status-all列出所有独立服务的启动状态

随着httpd服务的启动和停止,使用netstat -tlun 命令就会看到80端口出现和消失。这也就说明apache服务绑定的端口就是80,所以我们可以通过80端口是否在服务器中出现来判断apache服务是否启动。

  1. 独立服务的自启动管理

自启动指的是在系统重启之后,服务是否随着系统的启动而自动启动。如果启动了某个服务,那么这个服务会在系统重启之后启动吗?答案是不知道,因为启动命令只负责启动服务,而和服务的自启动完全没有关系。同样地,自启动命令只管理服务是否会在系统重启之后启动,而和当前系统中的服务是否启动没有关系。

独立服务的自启动方法有三种,我们分别来学习。

1)使用chkconfig服务自启动管理命令

第一种方法是利用chkconfig服务自启动管理命令来管理独立服务的自启动,这条命令的用法如下:

# chkconfig --list

使用chkconfig命令除了可以查看所有RPM包默认安装服务的自启动状态,也可以修改和设置RPM包默认安装服务的自启动状态,只是独立的服务和基于xinetd的服务的设定方法稍有不同。我们先来看看独立的服务如何设置。命令格式如下:

# chkconfig [--level 运行级别] [独立服务名] [on|off]
选项说明
--level 运行级别设定在哪个运行级别中开机自启动(on) ,或者关闭自启动(off)

例如:

# chkconfig --list | grep httpd

还记得0~6这7个Linux的运行级别吗?如果在0 ~ 6这7个运行级别中服务都显示关闭,则该服务不自启动。如果在某个运行级别中显示启用,则代表在进入这个运行级别时,该服务开机自启动。服务的自启动方法和服务的启动方法是不通用的,我们做一个实验验证一下。命令如下:

# /etc/init.d/httpd status

大家看到了吗?虽然apache被设置为自启动,但是当前系统中的apache是没有启动的,所以启动和自启动是独立的。

2)修改/etc/rc.d/rc.local文件,设置服务自启动

第二种方法就是修改/etc/rc.d/rc.local文件,在文件中加入服务的启动命令。这个文件是在系统启动时,在输入用户名和密码之前最后读取的文件(注意::/etc/rc.d/rc.loca和/etc/rc.local文件是软链接,修改哪个文件都可以)。这个文件中有什么命令,都会在系统启动时调用。那么,如果我们把服务的启动命令放入这个文件,这个服务就会在开机时自启动。命令如下:

# vim /etc/rc.d/rc.local

这样,只要重启之后,apache服务就会开机自启动了。推荐大家使用这种方法管理服务的自启动,有两点好处:

  • 第一,如果大家都采用这种方法管理服务的自启动,那么,当我们碰到一台陌生的服务器时,只要查看这个文件就知道这台服务器到底自启动了哪些服务,便于集中管理。
  • 第二,chkconfig命令只能识别RPM包默认安装的服务,而不能识别源码包安装的服务。源码包安装的服务的自启动也是通过/etc/rc.d/rc.local文件实现的,所以不会出现同一台服务器自启动了两种安装方法的同一个服务。

还要注意一下,修改/etc/rc.d/rc.local配置文件的自启动方法和chkconfig命令的自启动方法是两种不同的自启动方法。所以,就算通过修改/etc/rc.d/rc.local配置文件的方法让某个独立的服务自启动了,执行chkconfig --list命令并不会看到有什么变化。

  1. 使用ntsysv命令管理自启动

第三种方法是使用ntsysv命令调用窗口模式来管理服务的自启动,非常简单和方便。命令格式如下:

# ntsysv [--level 运行级别]
选项说明
--level 运行级别可以指定设定自启动的运行级别

例如:

# ntsysv --level 235

执行命令后,会和setup命令类似,出现命令界面,如图12-2所示。

9189dfac5c8ae7d078ae64e06c4692b8.png

图12-2 ntsysv命令界

这个命令的操作是这样的:

  • 上下键:在不同服务之间移动;
  • 空格键:选定或取消服务的自启动。也就是在服务之前是否输入“*”;
  • Tab键:在不同项目之间切换;
  • F1键:显示服务的说明;

需要注意的是,ntsysv命令不仅可以管理独立服务的自启动,也可以管理基于xinetd服务的自启动。也就是说,只要是RPM包默认安装的服务都能被ntsysv命令管理。但是源码包安装的服务不行。

这样管理服务的自启动多么方便,为什么还要学习其他的服务自启动管理命令呢??ntsysv命令虽然简单和方便,但它是红帽系列Linux的专有命令,其他的Linux发行版本不一定拥有这条命令,而且这条命令也不能管理源码包安装的服务,所以我们推荐大家使用/etc/rc.d/rc.local文件来管理服务的自启动。

  1. 独立服务的启动脚本分析

既然独立服务的启动是依靠/etc/init.d/httpd这个脚本来进行启动管理的,那么这个脚本中到底是什么样子的?既然我们已经学习了Shell脚本,那么我们来学习一下这个脚本到底是怎么实现apache服务的管理的。命令如下:

# vim /etc/init.d/httpd 

通过这个脚本,我们对apache服务的启动有了更深入的了解。

查看服务启动和关闭顺序:

CentOS 系统中,服务的启动和关闭顺序是在/etc/rc数字.d目录中保存的,数字表示运行级别。以启动级别3为例,进入/etc/rc3.d目录下查看文件列表如下:

# ll /etc/rc3.d/

在上面的文件列表中,所有的文件都是/etc/init.d 中的服务脚本的软链接,其文件名格式是由S或K、顺序值、服务名称3部分组成的。对于底层的系统服务,通常S值小K值大(即早启动、晚关闭),而对于普通服务,通常S值大K值小(即晚启动、早关闭)。在上面的列表中可以看到 httpd 服务顺序为 S85。而K15 位于除了3和5的其他级别中,表示在关机或重启时自动关闭 Nginx。

在系统开机时,会按照S的顺序从小到大调用脚本,并传递参数 start;在系统关闭时,会按照K的顺序从小到大调用脚本,并传递参数 stop。若需要修改顺序时,可以修改服务脚本中#chkconfig:指定的顺序,然后使用 chkconfig 命令重新添加服务。

12.2.2 基于xinetd服务的管理

本小节学习基于xinetd服务的管理方法。基于xinetd的服务同样有启动管理和自启动管理之分,而且不管是启动管理还是自启动管理,都只有一种方法,相比独立的服务简单一些。

  1. 基于xinetd服务的启动

基于xinetd的服务没有自己独立的启动脚本程序,是需要依赖xinetd的启动脚本来启动的。xinetd本身是独立的服务,所以xinetd服务自己的启动方法和独立服务的启动方法是一致的。但是所有基于xinetd这个超级守护进程的其他服务就不是这样的了,必须修改该服务的配置文件,才能启动基于xinetd的服务。所有基于xinetd服务的配置文件都保存在/etc/xinetd.d/目录中。

我们使用Telnet服务来举例。Telnet服务是用来进行系统远程管理的,端口是23。不过需要注意的是,Telnet服务的远程管理数据在网络中是明文传输的,非常不安全,所以在生产服务器上是不建议启动Telnet服务的。在生产服务器上,远程管理使用的是ssh协议,ssh协议是加密的,更加安全。

Telnet服务也是分为客户端/服务器端的,其中服务器端是用来启动Telnet服务的,并不安全;客户端是用来连接服务器端或测试服务器的端口是否开启的,在实际工作中我们主要使用Telnet客户端来测试远程服务器开启了哪些端口。客户端的命令格式如下:

# telnet 服务器IP

例如:

# telnet 192.168.0.210 22

虽然Telnet服务不安全,但Telnet服务是基于xinetd的服务,我们使用Telnet服务来学习一下基于xinetd服务的启动管理。在目前的Linux系统中,Telnet的服务器端都是不安装的,如果要进行测试,则需要手工安装。安装命令如下:

# yum install telnet-server -y

接下来我们就要启动Telnet服务了。既然基于xinetd服务的配置文件都在/etc/xinetd.d/目录中,那么Telnet服务的配置文件就是/etc/xinetd.d/telnet。我们打开这个文件看看,如下:

# vim /etc/xinetd.d/telnet 

如果想要启动Telnet服务,则只需要把/etc/xinetd.d/telnet文件中的disable=yes 改为disable=no 即可。disable代表取消,disable=yes 代表取消是yes,当然不启动服务; disable=no 代表取消是no,当然就是启动服务了。具体命令如下:

# sed -i 's/yes/no/' /etc/xinetd.d/telnet

基于xinetd服务的启动都是这样的,只需修改/etc/xinetd.d/目录中的配置文件,然后重启xientd服务即可。

  1. 基于xientd服务的自启动

基于xinetd服务的自启动管理有两种方法,分别是通过chkconfig命令管理自启动和通过ntsysv命令管理自启动。但是不能通过修改/etc/rc.d/rc.local配置文件来管理自启动,因为基于xinetd的服务没有自己的启动脚本程序。我们分别来看看。

1)使用chkconfig命令管理自启动

chkconfig自启动管理命令可以管理所有RPM包默认安装的服务,所以也可以用来管理基于xinetd服务的自启动。命令格式如下:

# chkconfig 服务名 on|off

例如:

# chkconfig telnet on

2)使用ntsysv命令管理自启动

ntsysv命令既然可以管理所有RPM包默认安装的服务,当然也能管理基于xinetd的服务。命令的使用方法和管理独立的服务是一样的,这里就不再重复介绍了。

其实,如果我们仔细来看,就会发现基于xinetd服务的启动和自启动区分得并不严格。启动命令也会把服务设置为自启动,自启动命令也会把服务设置为启动。我们做一个实验看看,命令如下:

# grep disable /etc/xinetd.d/telnet | sed -i 's/no/yes/g'

这个实验说明了基于xinetd服务的启动和自启动命令之间是通用的,在当前系统中启动了服务,服务的自启动也会开启;关闭了服务的自启动,当前系统中的服务也会关闭。

12.3 源码包安装的服务管理

本节我们先学习源包服务的启动管理,再来学习源码包服务的自启动管理,最后学习如何让源码包服务被系统服务管理命令识别。

12.3.1 源码包服务的启动管理

源码包服务中所有的文件都会安装到指定目录当中,并且没有任何垃圾文件产生(Linux的特性) ,所以服务的管理脚本程序也会安装到指定目录中。源码包服务的启动管理方式就是在服务的安装目录中找到管理脚本,然后执行这个脚本。问题来了:每个服务的启动脚本都是不一样的,我们怎么确定每个服务的启动脚本呢?还记得在安装源码包服务时,我们强调需要查看每个服务的说明文档吗(一般是INSTALL或READEM)?在这个说明文档中会明确地告诉大家服务的启动脚本是哪个文件。

我们还是用apache服务来举例。一般apache服务的安装位置是/usr/local/apache2/目录,那么apache服务的启动脚本就是/usr/local/apache2/bin/apachectl文件(查询apache说明文档得知)。启动命令如下:

# /usr/local/apache2/bin/apachectl start|stop|restart...

例如:

# /usr/local/apache2/bin/apachectl start

注意:不管是源码包安装的apache,还是RPM包默认安装的apache,虽然在一台服务器中都可以安装,但是只能启动一个(除非修改默认端口),因为它们都会占用80端口。

源码包服务的启动方法就这一种,比RPM包默认安装的服务要简单一些。

12.3.2 源码包服务的自启动管理

源码包服务的自启动管理也不能依靠系统的服务管理命令,而只能把标准启动命令写入/etc/rc.d/rc.local文件中。系统在启动过程中读取/etc/rc.d/rc.local文件时,就会调用源码包服务的启动脚本,从而让该服务开机自启动。命令如下:

# vim /etc/rc.d/rc.local

12.3.3 让源码包服务被服务管理命令识别

在默认情况下,源码包服务是不能被系统的服务管理命令所识别和管理的,但是如果我们做一些设定,则也是可以让源码包服务被系统的服务管理命令所识别和管理的。不过并不推荐大家这样做,因为这会让本来区别很明确的源码包服务和RPM包服务变得容易混淆,不利于系统维护和管理。

我们做一个实验,看看如何把源码包安装的apache服务变为和RPM包默认安装的apache服务一样,可以被service、chkconfig、ntsysv命令所识别。实验如下:

1)安装源码包的apache服务,并启动安装源码包的apache服务;

# cd /usr/local/src/

2)让源码包安装的apache服务能被service命令管理启动;

# ln -s /usr/local/apache2/bin/apachectl /etc/init.d/apache

service命令其实只是在/etc/init.d/目录中查找是否有服务的启动脚本,所以我们只需要做一个软链接,把源码包的启动脚本链接到/etc/init.d/目录中,就能被service命令所管理了。为了照顾大家的习惯,我把软链接文件命名为apache,注意这不是RPM包默认安装的apache服务

3)让源码包安装的apache服务能被chkconfig命令管理自启动;

# cd

5)让ntsysv命令可以管理源码包安装的apache服务;

ntsysv命令其实和chkconfig命令使用同样的管理机制,也就是说,ntsysv 已经可以进行源码包安装apache服务的自启动管理了,如图12-3 所示:

6adc48d8cd01c834f5b7af699f6076e8.png

图12-3 ntsysv命令识别apache

总结一下:如果想让源码包服务被service命令所识别和管理,则只需做一个软链接把启动脚本链接到/etc/init.d/目录中即可。要想让源码包服务被chkconfig命令所识别,除了需要把服务的启动脚本链接到/etc/init.d/目录中,还要修改这个启动脚本,在启动脚本的开头加入如下内容:

#chkconfig: 运行级别 启动顺序 关闭顺序

然后需要使用chkconfig--add 服务名的方式把服务加入chkconfig命令的管理中。命令格式如下:

# chkconfig [选项] [服务名]
选项说明
--add把服务加入chkconfig命令的管理中;
--del把服务从chkconfig命令的管理中删除;

例如:

# chkconfig --del httpd

12.3.4 编写服务管理脚本

在上一节中httpd服务的启动程序apachectl脚本自带了start、stop、restart、reload等参数,那么将该脚本直接通过软链接到/etc/init.d/目录中,就能被service所识别和使用,但是有一些服务是没有类似start、stop、restart、reload等参数的,那么还能使用service 服务名 start进行启动或关闭吗?答案是可以的,但是需要我们在/etc/init.d/目录下编写服务管理脚本。

  1. CentOS 6.x 系统中,service 命令实际上是调用了/etc/init.d/目录下的 shell 脚本,也就是说如下两行命令其实是等价的。
# /etc/init.d/network restart

在上述命令中,network是shell脚本的文件名,start是传递给脚本的参数。因此,将 nginx 添加到系统服务中时,只需要在/etc/init.d/中编写一个文件名为 nginx 的 shell 脚本即可。

接下来执行vim /etc/init.d/nginx命令编写一个 shell 脚本实现 Nginx 服务管理,提供start、stop、reload、restart 4个参数,具体代码如下。

[root@localhost ~]# vim /etc/init.d/nginx
#!/bin/bash
DAEMON=/usr/local/nginx/sbin/nginx
case "$1" in
        start)
                echo "Starting nginx daemon..."
                $DAEMON && echo "SUCCESS"
        ;;
        stop)
                echo "Stoping nginx daemon..."
                $DAEMON -s quit && echo "SUCCESS"
        ;;
        reload)
                echo "Reloading nginx daemon..."
                $DAEMON -s reload && echo "SUCCESS"
        ;;
        restart)
                echo "Restarting nginx daemon..."
                $DAEMON -s quit
                $DAEMON && echo "SUCCESS"
        ;;
        *)
                echo "Usage:systemctl nginx [start|stop|restart|reload]"
                exit 2
        ;;
esac

完成上述脚本编写并保存后 ,使用如下命令为 nginx 脚本添加可执行权限,命令如下:

# chmod 755 /etc/init.d/nginx 

对于一个要经常使用的服务器而言,每次开机后,都需要用户手动开启一些服务较为麻烦。接下来,将通过 chkconfig 命令完成 Nginx 开机自启动的功能。

若要将 Nginx 服务实现开机启动,就需要在/etc/init.d/nginx脚本文件中添加对chkconfig 的支持。使用编辑器打开 nginx 脚本文件,在第2行的位置新增如下内容:

[root@localhost ~]# vim /etc/init.d/nginx 
#!/bin/bash
#chkconfig: 35 85 15
...

上述代码中,冒号后的 35 表示 Nginx 服务允许的启动级别是3和5,若暂不开启任何启动级别,可以使用一个横线-代替。85和15 用于设置 Nginx 服务的启动(S)顺序和关闭(K)顺序,即 S85和K15。数值小的先执行,数值大的后执行,该值是用户自定义的,取值范围在0~99之间。对于 Nginx 服务,推荐S值较大,K值较小(即晚启动,早关闭)。

接下来使用 chkconfig 命令执行添加 Nginx 服务自启动操作,具体命令如下:

# chkconfig --add nginx

执行命令后利用 chkconfig --list 命令查看添加后的效果,如下所示,可以看到 nginx 服务已经添加成功,且7个启动级别中只有3和5是 on(开启)状态,其他级别是off(关闭)状态。

# chkconfig --list
  1. 对于CentOS7.x系统来说,服务systemctl脚本存放在/usr/lib/systemd/ 目录中,有系统(system)和用户(user)之分,即:/usr/lib/systemd/system/usr/lib/systemd/user

每一个服务以.service结尾,脚本一般会分为3部分:[Unit]、[Service]和[Install],就以nginx为例吧,具体内容如下:

# vim /lib/systemd/system/nginx.service 
参数说明
[Unit]
Description服务的简单描述;
Documentation服务文档;
After=无依赖,仅当依赖的服务启动之后再启动自定义的服务单元;
Before无依赖,表示服务需要在***服务启动之前执行;
Wants弱依赖关系;
Requires强依赖关系;
[Service]
Type定义启动类型
simple:默认值,ExecStart字段启动的进程为主进程;
forking:后台运行
oneshot:类似于simple,但只执行一次,Systemd 会等它执行完,才启动其他服务;
notify:类似于simple,启动结束后会发出通知信号,然后 Systemd 再启动其他服务;
dbus:类似于simple,但会等待 D-Bus 信号后启动;
idle:类似于simple,但是要等到其他任务都执行完,才会启动该服务。一种使用场合是为让该服务的输出,不与其他服务的输出相混合;
PIDFilepid文件路径;
ExecStartPre启动服务之前执行的命令;
ExecStartPost启动服务之后执行的命令;
ExecStopPost停止服务之后执行的命令;
ExecStart服务的启动命令,使用绝对路劲,否则会报错;
ExecReload服务的重载命令,使用绝对路劲,否则会报错;
ExecStop服务的停止命令,使用绝对路劲,否则会报错;
PrivateTmpTrue表示给服务分配独立的临时空间;
[Install]
WantedBy服务安装的用户模式,从字面上看,就是想要使用这个服务的有是谁?上文中使用的是:multi-user.target ,就是指想要使用这个服务的目录是多用户。

接下来使用systemctl命令来启动nginx服务,并查看其状态:

# systemctl start nginx

最后在将nginx服务加入自启动,命令如下:

# systemctl enable nginx

在 CentOS 7.x 中使用命令systemctl enable|disable 服务名,加入|删除服务的自启动,由上述命令输出结果可以看出,该命令将/usr/lib/systemd/system/nginx.service通过软链接的形式链接到了/etc/systemd/system/multi-user.target.wants/目录下:

# ll /etc/systemd/system/multi-user.target.wants/nginx.service 

12.4 总结服务管理

服务管理的分类较多,方法也比较多,容易混淆,我们画一张图来总结一下Linux中服务管理的方法,如图12-4所示。

71c32fceb8588c904ab5014bc7bcb9ec.png
图12-4 服务管理总结

12.5 Linux中常见服务的作用

Linux中的服务数非常多,我们在学习时一直使用apache服务作为实例。那么很多人会产生困惑:其他的服务都是干什么的呢?它们有什么作用呢?是不是必须启动的呢?本节我们就来介绍Linux中常见服务的作用。

在生产服务器上,安装完Linux之后有一步重要的工作,就是服务优化。也就是关闭不需要的服务,只开启需要的服务。因为服务启动得越多,占用的系统资源就越多,而且被攻击的可能性也增加了。如果要进行服务优化,就需要知道这些服务都有什么作用,如表12-1所示。

服务名称功能简介建议
acpid电源管理接口。如果是笔记本用户建议开启,可以监听内核层的相关电源事件开启
anacron系统的定时任务程序。cron的一个子系统,如果定时任务错过了执行时间,可以通过anacron继续唤醒执行关闭
alsasoundAlsa声卡驱动。如果使用alsa声卡,开启关闭
apmd电源管理模块。如果支持acpid,就不需要apmd,可以关闭关闭
atd指定系统在特定时间执行某个任务,只能执行一次。如果需要则开启,但我们一般使用crond来进行循环定时任务关闭
auditd审核子系统。如果开启了此服务,SELinux的审核信息会写入/var/log/audit/audit.log文件,如果不开启,审核信息会记录在syslog中开启
autofs让服务器可以自动挂载网络中的其他服务器的共享数据,一般用来自动挂载NFS服务。如果没有NFS服务建议关闭关闭
avahi-daemonAvahi是zeroconf协议的实现。它可以在没有DNS服务的局域网里发现基于zeroconf协议的设备和服务。除非有兼容设备或使用zeroconf协议,否则关闭关闭
bluetooth蓝牙设备支持。一般不会在服务器上启用蓝牙设备,关闭它关闭
capi仅对使用ISND设备的用户有用关闭
chargen-dgram使用UDP协议的chargenserver。主要功能是提供类似远程打字的功能关闭
chargen-stream同上关闭
cpuspeed可以用来调整CPU的频率。当闲置时可以自动降低CPU频率来节省电量开启
crond系统的定时任务,一般的Linux服务器都需要定时任务帮助系统维护。建议开启开启
cvs一个版本控制系统关闭
daytime-dgramdaytime使用TCP协议的Daytime守护进程,该协议为客户机实现从远程服务器获取日期和时间的功能关闭
daytime-stream同上关闭
dovecot邮件服务中POP3/IMAP服务的守护进程。主要用来接收信件,如果启动了邮件服务则开启,否则关闭关闭
echo-dgram服务器回显客户服务的进程关闭
echo-stream同上关闭
firstboot系统安装完成之后,有个欢迎界面,需要对系统进程初始设定。就是这个进程的作用。既然不是第一次启动了,关闭吧关闭
gpm在字符终端(tty1-tty6)中可以使用鼠标复制和粘贴。就是这个服务的功能开启
haldaemon检测盒支持USB设备。如果是服务器可以关闭,个人机建议开启关闭
hidd蓝牙鼠标、键盘等蓝牙设备检测。必须启动bluetooth服务关闭
hplipHP打印机支持,如果没有HP打印机关闭吧关闭
httpdapache服务的守护进程。如果需要启动apache,就开启开启
ip6tablesIPv6的防火墙,目前IPv6协议并没有使用,可以关闭关闭
iptables防火墙功能,Linux中防火墙是内核支持功能。这是服务器的主要防护手段,必须开启开启
irdaIrDA提供红外线设备(笔记本,PDA’s,手机,计算器等等)间的通讯支持。关闭吧关闭
irqbalance支持多核处理器,让CPU可以自动分配系统中断(IRQ),提高系统性能。目前服务器多是多核CPU,请开启开启
isdn使用ISDN设备连接网络。目前主流的联网方式是光纤接入和ADSL,ISDN已经非常少见,请关闭关闭
kudzu该服务可以在开机时进行硬件检测,并会调用相关的设置软件。建议关闭,仅在需要时开启关闭
lvm2-monitor该服务可以让系统支持LVM逻辑卷组,如果分区采用的是LVM方式,那么应该开启。建议开启开启
mcstransSELinux的支持服务。建议启动开启
mdmonitor该服务用来监测SoftwareRAID或LVM的信息。不是必须服务,建议关闭关闭
mdmpd该服务用来监测Multi-Path设备。不是必须服务关闭
messagebus这是Linux的IPC(InterprocessCommunication,进程间通讯)服务,用来在各个软件中交换信息。个人建议关闭关闭
microcode_ctlIntel系列的CPU可以通过这个服务支持额外的微指令集关闭
mysqldmysql数据库服务器。如果需要就开启,否则关闭开启
namedDNS服务的守护进程,用来进行域名解析。如果是DNS服务器则开启,否则关闭关闭
netfs该服务用于在系统启动时自动挂载网络中的共享文件空间,比如NFS,Samba等等。需要就开启,否则关闭关闭
network提供网络设置功能。通过这个服务来管理网络,所以开启开启
nfsNFS(NetworkFileSystem)服务,Linux与Linux之间的文件共享服务。需要就开启,否则关闭关闭
nfslock在Linux中如果使用了NFS服务,为了避免同一个文件被不同的用户同时编辑,所有有这个锁服务。有NFS是开启,否则关闭关闭
ntpd该服务可以通过互联网自动更新系统时间,使系统时间永远都准确。需要则开启,但不是必须服务关闭
pcscd智能卡检测服务,可以关闭关闭
portmap用在远程过程调用(RPC)的服务,如果没有任何RPC服务时,可以关闭。主要是NFS和NIS服务需要关闭
psacct该守护进程支持几个监控进程活动的工具关闭
rdisc客户端ICMP路由协议关闭
readahead_early在系统开机的时候,先将某些进程加载如内存整理,可以加快一点启动速度关闭
readahead_later同上关闭
restorecond用于给SELinux监测和重新加载正确的文件上下文。如果开启SELinux则需要开启关闭
rpcgssd与NFS有关的客户端功能。如果没有NFS就关闭吧关闭
rpcidmapd同上关闭
rsync远程数据备份守护进程关闭
sendmailsendmail邮件服务的守护进程。如果有邮件服务就开启,否则关闭关闭
setroubleshoot该服务用于将SELinux相关信息记录在日志/var/log/messages中。建议开启开启
smartd该服务用于自动检测硬盘状态。建议开启开启
smb网络服务samba的守护进程。可以让Linux和Windows之间共享数据。如果需要则开启关闭
squid代理服务的守护进程。如果需要则开启,否则关闭关闭
sshdssh加密远程登陆管理的服务。服务器的远程管理必须使用此服务,不要关闭开启
syslog日志的守护进程开启
vsftpdvsftp服务的守护进程。如果需要FTP服务则开启,否则关闭关闭
xfs这个是XWindow的字体守护进程。为图形界面提供字体服务,如果不启动图形界面,就不用开启关闭
xinetd超级守护进程。如果有依赖xinetd的服务就必须开启开启
ypbind为NIS(网络信息系统)客户机激活ypbind服务进程关闭
yum-updatesdYum在线升级服务关闭
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值