Linux服务管理

Linux服务管理是Linux运维的一个基本工作。现在让我们来学习使用System V如何管理Linux系统上的服务。

01

什么是服务?

Linux系统的服务,又称为daemon,是指常驻在内存中持续运行,以提供所需服务(系统或网络服务)的进程。简单的说,就是程序启动后就会持续在后台执行,等待用户或者其他软件调用使用。

例如,在Linux中提供用来传送与接收电子邮件的电子邮件服务 (Mail Service);或者管理所有打印机设备,以便给用户使用打印机的打印服务(Printing Service)。这些都是Linux中的服务。

02

服务的分类

在开始介绍如何管理Linux的服务前,首先先介绍下Linux的服务究竟有哪些。这些服务的分类方法,以及一些关于服务的基本概念。

我们可以按照服务的功能和服务管理方式进行分类。

2.1

按照服务的功能

Linux提供了许多的服务。这些服务,按照功能可以划分为:

系统服务:某些服务的服务对象是Red Hat Enterprise Linux系统本身,或者Red Hat Enterprise Linux 系统的用户,这类的服务我们称为系统服务(System Service)。比如负责用来监控软件磁盘阵列状态的mdmonitor服务,就是一个系统服务。

网络服务:另外有许多服务,皆是提供给网络中的其他客户端(Clients)调用使用,这类的服务我们统称为网络服务(Networking Service)。例如:网站服务(Web Service)、网络文件系统服务(Networking File System Service)等等,都是属于网络服务。

2.2

按照服务管理方式

按照服务启动的方法与执行时的特性,还可以分为独立系统服务(Standalone Service)与临时服务(Transient Service)两种。

独立系统服务:服务一经启动,除非因为关闭系统或管理者手动结束,否则都将在后台执行,不管有没有被用到。这样的服务,我们称为独立系统服务(Standalone Service)。独立系统服务有时候又被称为SysV服务(SysV Service)。

独立系统服务具备下面两个特性:

1

响应速度较快:由于独立系统服务一经启动,除非被Red Hat Enterprise Linux或者系统管理者停止,否则将会持续的在后台执行。因为独立系统服务会一直执行,一旦客户端调用Red Hat Enterprise Linux的独立系统服务时,独立系统服务就可以马上响应,因此,独立系统服务的响应速度较启动文件快。

2

占用系统资源:也因为独立系统服务会持续的执行,即使在没有人调用也会持续的执行,因此独立系统服务较耗用系统的CPU、内存等资源。

临时服务:与独立系统服务不同,临时服务(Transient Service)平时并不会启动,而是当客户端需要时才会被启动,使用完毕就会结束。

与独立系统服务相比,临时服务具备下面的特性:

1

响应速度较慢:临时服务第一个特性就是响应速度较慢。

由于临时服务是在客户端调用时才会被启动,客户端必须要等到服务完全启动后才能使用临时服务。对UNIX、Linux系统来说,启动一个程序是一个高成本的行为。一台忙碌的Red Hat Enterprise Linux系统启动一个程序可能需要几秒钟,甚至数分钟才能完成! 这会造成客户端调用启动文件,可能得等上些许的时间,才能顺利的调用启动文件。

2

较节省系统资源:也由于临时服务运行上的特性,平时不会执行,就不会占用你的CPU与内存。因此,临时服务较节省Red Hat Enterprise Linux的系统资源。

03

手动启动和停止服务

3.1

手动启动服务

在以前的UNIX系统上,要启动一个服务,得自己执行该服务的程序(Program)。以Red Hat Enterprise Linux提供远程登录的SSH服务而言,SSH服务的程序文件是sshd。

# ssh localhost

ssh: connect to host localhost port 22: Connection refused ①

# which sshd

/usr/sbin/sshd ②

# /usr/sbin/sshd ③

# ssh localhost

The authenticity of host 'localhost (127.0.0.1)' can't be established. ④

RSA key fingerprint is d5:d1:60:e3:ca:2a:85:23:60:93:7e:4a:78:97:be:33. Are you sure you want to continue connecting (yes/no)?

#

① 我先使用ssh连接至本机(localhost)。结果ssh告诉我们:“connect to host localhost port 22:Connection refused”,这表示因为某些因素(通常是因为服务没有启动),无法连接至 localhost的SSH 服务。

② 我先找出SSH服务的程序文件sshd的绝对位置。

③ 然后手动的执行sshd。

④ 最后,再尝试着联机到本机,现在就不再出现“Connection refused”的错误信息了。

虽然传统启动服务的方法看起来很简单,管理者只需要找出服务的程序文件,直接执行这个程序文件就可以了;但实际上往往却得额外处理很多的事情。以SSH服务来说,sshd启动的时候,会去读取系统密钥文件(System Key File),如果sshd找不到系统密钥文件,那么sshd将无法顺利启动。甚至部分的服务,还提供了一些额外的功能,你得自己加上启动参数 (Startup Options),才能享有该服务提供的功能。比如 sshd 就提供了一个-d的参数,借助这个参数可以启动sshd的排错功能。

很遗憾的,不同的服务启动参数可能都不一样!所以,每次要启动某一项服务时,你得自己阅读相关文件,才能正确的指出该程序文件的启动参数。

3.2

手动停止服务

而在传统的UNIX系统上,如果要停止一个服务,那就得传送适当的信号(Signal) 给服务的进程(Process)。一般来说,你可以传送以下几个信号给服务的进程:

1

SIGKILL(9):请 Red Hat Enterprise Linux 马上中止该进程。

2

SIGTERM(15):请该进程自行结束。服务的进程接收到上述的信号后,便会依照信号的意义,被系统中止或者自己结束掉。

以下是我使用手动传送信号的方法,停止 SSH 服务的示范:

# ps xa | grep /usr/sbin/sshd

12614 ? Ss0:00 /usr/sbin/sshd ①

12680 pts/3 R+0:00 grep /usr/sbin/sshd

# ssh localhost

The authenticity of host 'localhost (127.0.0.1)' can't be established. ②

RSA key fingerprint is d5:d1:60:e3:ca:2a:85:23:60:93:7e:4a:78:97:be:33.

Are you sure you want to continue connecting (yes/no)?

# killall -9 sshd ③

# ssh localhost

ssh: connect to host localhost port 22: Connection refused ④

#

① 我用ps找出SSH服务的进程(也就是/usr/sbin/sshd)。由此可知,我的Red Hat Enterprise Linux正在执行SSH服务。

② 现在使用ssh连接到本机,看到这个信息,代表本机的确有启动SSH服务。

③ 现在,手动的使用killall传送SIGKILL(9)的信号,以便要求Red Hat Enterprise Linux立即结束 sshd进程。

④ 最后,再使用 ssh 连接一次,你会发现,现在就无法调用SSH服务了!

04

使用启动脚本文件管理服务

在这之前介绍了如何通过服务的程序文件来启动服务,与使用信号来结束服务的进程。你应该会觉得:要管理Red Hat Enterprise Linux的服务,竟然是这么麻烦! 其实,传统UNIX的服务管理方法就是这样讨厌,现今,仍有部分的UNIX系统还是使用相同的方法来管理系统上的服务。

为了简化Red Hat Enterprise Linux服务管理的麻烦,Red Hat Enterprise Linux特别为每一个独立式的服务,提供了一个服务启动脚本文件(Service Startup Script)。通过服务启动脚本文件,你就可以用比较轻松的方式来启动,或者停止Red Hat Enterprise Linux上的每一个独立系统服务。所有的服务启动文件被储存在/etc/rc.d/init.d/目录下。

以下是我的 /etc/rc.d/init.d/ 目录下的内容:

# ls /etc/rc.d/init.d/

acpid*gpm*netdump*rstatd*

amd*haldaemon*netdump-server*rusersd*

anacron*halt*netfs*rwhod*

...

FreeWnn*mysqld*rpcidmapd*

functions*named*rpcsvcgssd*

/etc/rc.d/init.d/里面每一个文件就是某一个服务的启动脚本文件,你可以直接执行某一个启动脚本文件,用来启动或者停止该服务。

现在,让我们来试着执行/etc/rc.d/init.d/sshd这个服务启动脚本文件:

# /etc/rc.d/init.d/sshd

用法: /etc/rc.d/init.d/sshd

#

上面的信息告诉我们,执行/etc/rc.d/init.d/sshd这个启动脚本文件时,还必须指定一个动作参数(Action Options),以便让服务启动脚本文件能够知道,你要对该服务作什么动作。不同的服务启动脚本文件,可能会有不同的动作参数。常见动作参数含义:

参数

说明

start

启动这个服务

stop

停止这个服务

restart

先停止,再启动,也就是重新启动的意思

reload

重载配置文件,这个参数只有在服务已经启动的状况下才能使用

condrestart

有条件的重新启动,这个服务必须是已经启动的,才会被重新启动;

如果这个服务尚未启动,则无须启动之。

status

查看目前服务的启动状态

举个例子

使用启动脚本文件重启network网络服务范例:

# /etc/init.d/network restart

Shutting down interface eth0: [ OK ]

Shutting down interface eth1: [ OK ]

Shutting down loopback interface: [ OK ]

Bringing up loopback interface: [ OK ]

Bringing up interface eth0:

Determining IP information for eth0... done. [ OK ]

Bringing up interface eth1: Determining if ip address 10.1.1.1 is already in use for device eth1... [ OK ]

05

使用service命令

坦白说,我不是很推荐使用独立系统服务的启动脚本文件来启动或停止服务! 主要的原因不外乎:

必须输入又臭又长的路径名称,才能执行独立系统服务的启动程序文件。如果不小心打错字,Red Hat Enterprise Linux就无法顺利启动或者停止该服务。

未来的Red Hat Enterprise Linux可能会更改服务启动脚本文件的存放路径,如果你习惯执行服务启动程序文件的话,以后使用更新的Red Hat Enterprise Linux时,可能无法正确的找到服务启动文件。

基于上述的原因,我建议你改用Red Hat Enterprise Linux提供的service工具,取代直接执行服务启动脚本文件:

service FILENAME ACTION

其中的FILENAME就是服务启动脚本文件的文件名(Filename);而ACTION则是服务启动程序文件提供的动作参数,比如start、stop、restart。

举个例子

使用service重启network网络服务范例:

# service network restart

Shutting down interface eth0: [ OK ]

Shutting down interface eth1: [ OK ]

Shutting down loopback interface: [ OK ]

Bringing up loopback interface: [ OK ]

Bringing up interface eth0:

Determining IP information for eth0... done. [ OK ]

Bringing up interface eth1: Determining if ip address 10.1.1.1 is already in use for device eth1... [ OK ]

关注我们

云运维联盟

专注Linux云平台运维

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180705G1X8Q100?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券