Linux 服务管理

系统为了某些功能必须要提供一些服务(不论是系统本身还是网络方面),这个服务就称为 Service。本文中的系统环境为 CentOS 6.8。


运行级别

运行级别 含义
0 关机
1 单用户模式,主要用于系统修复
2 不完全的命令行模式,不含 NFS 服务
3 完全的命令行模式,标准字符界面
4 系统保留
5 图形模式
6 重启动

查看运行级别

$ runlevel

执行结果:N 3

N - 表示上一个运行级别,输出 N 表示没有上个运行级别,意味着启动后进入 3 后没有执行过 init <level> 命令

3 - 标准字符界面,表示当前运行级别

更改运行级别

$ init <level>

即使 init <level> 没有成功执行而进入指定的级别,之后执行命令 runlevel 输出的却是成功执行了 init <level> 之后的结果,例如

$ runlevel
3
$ init 5
Retrigger failed udev events    [ OK ]
Starting jexec services    # 一直阻塞在此处
# ctrl+c 之后,执行 runlevel
$ runlevel
3 5

也就是说,命令 runlevel 输出的的第一个级别是上一次执行 init <level> 之前的当前运行级别,第二个级别是执行 init <level> 时指定的级别。

不建议使用 init 0 和 init 6 执行关机和重启命令,可能造成某些服务不能正确关闭,不在 root 下执行会不成功。修改 /etc/inittab ,可以使系统启动后直接进入指定的运行级别,/etc/inittab 部分内容如下所示

# Default runlevel. The runlevels used are:
#   0 - halt (Do NOT set initdefault to this)
#   1 - Single user mode
#   2 - Multiuser, without NFS (The same as 3, if you do not have networking)
#   3 - Full multiuser mode
#   4 - unused
#   5 - X11
#   6 - reboot (Do NOT set initdefault to this)
#
id:3:initdefault:

端口

一个 IP 地址可以有65536个端口(0-65535),一般的,0-10000是系统预留端口,10001以上的端口用户可自由使用。

查看端口

/etc/services

文件 /etc/servicesservice-name port/protocol [aliases] [# comment] 的形式描述了每个服务,/etc/services 部分内容如下

# service-name  port/protocol  [aliases ...]   [# comment]

ftp-data        20/tcp
ftp-data        20/udp
# 21 is registered to ftp, but also used by fsp
ftp             21/tcp
ftp             21/udp          fsp fspd
ssh             22/tcp                          # The Secure Shell (SSH) Protocol
ssh             22/udp                          # The Secure Shell (SSH) Protocol
telnet          23/tcp
telnet          23/udp
# 24 - private mail system
lmtp            24/tcp                          # LMTP Mail Delivery
lmtp            24/udp                          # LMTP Mail Delivery
smtp            25/tcp          mail
smtp            25/udp          mail

netstat

Netstat 命令用于显示各种网络相关信息,如网络连接、路由表、接口状态 (Interface Statistics)、masquerade 连接、多播成员 (Multicast Memberships)。

-a 显示所有(all)选项,默认(没有-a)不显示 LISTEN 相关
-t 仅显示tcp相关选项
-u 仅显示udp相关选项
-n 拒绝显示别名,能显示数字的全部转化成数字。
-l 仅列出有在 Listen (监听) 的服務状态
-p 显示建立相关链接的程序名
-r 显示路由信息,路由表
-e 显示扩展信息,例如uid等
-s 按各个协议进行统计
-c 每隔一个固定时间,执行该netstat命令。

说明:LISTENLISTENING 的状态只有用 -a 或者 -l 才能看到。

$ netstat -tulp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name
tcp        0      0 localhost:smtp              *:*                         LISTEN      1476/master
tcp        0      0 *:ssh                       *:*                         LISTEN      1397/sshd
tcp        0      0 localhost:smtp              *:*                         LISTEN      1476/master
tcp        0      0 *:ssh                       *:*                         LISTEN      1397/sshd
$ netstat -tunlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name
tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN      1476/master
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      1397/sshd
tcp        0      0 ::1:25                      :::*                        LISTEN      1476/master
tcp        0      0 :::22                       :::*                        LISTEN      1397/sshd

Recv-Q 接收队列
Send-Q 发送队列
Foreign Address 远程连接本服务的地址

$ netstat -anp
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name
tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN      1476/master
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      1397/sshd
tcp        0     64 192.168.1.10:22             192.168.1.2:62142           ESTABLISHED 1886/sshd
tcp        0      0 192.168.1.10:22             192.168.1.2:62386           ESTABLISHED 2449/sshd
tcp        0      0 ::1:25                      :::*                        LISTEN      1476/master
tcp        0      0 :::22                       :::*                        LISTEN      1397/sshd
Active UNIX domain sockets (servers and established)
Proto RefCnt Flags       Type       State         I-Node PID/Program name    Path
unix  2      [ ACC ]     STREAM     LISTENING     9032   1/init              @/com/ubuntu/upstart
unix  9      [ ]         DGRAM                    12907  1330/rsyslogd       /dev/log
unix  2      [ ACC ]     STREAM     LISTENING     13283  1476/master         public/cleanup
unix  2      [ ACC ]     STREAM     LISTENING     13290  1476/master         private/tlsmgr
unix  2      [ ACC ]     STREAM     LISTENING     13294  1476/master         private/rewrite
unix  2      [ ]         DGRAM                    9534   586/udevd           @/org/kernel/udev/udevd

可以发现有如下所示的两行

tcp        0     64 192.168.1.10:22             192.168.1.2:62142           ESTABLISHED 1886/sshd
tcp        0      0 192.168.1.10:22             192.168.1.2:62386           ESTABLISHED 2449/sshd

这对应远程连接的两个 XShell 会话, ESTABLISHED 表示正在连接着 22 端口号,也就是 ssh 服务。

RPM 安装的服务

命令 chkconfig

chkconfig --list 查看已安装的服务以及各个服务在不同运行级别下的自启动状态

RPM 包常规安装位置

* /etc/init.d/ : 启动脚本
* /etc/sysconfig/ : 初始化环境配置文件
* /etc/ : 配置文件
* /etc/xinetd.conf : xinetd配置文件
* /etc/xinetd.d/ : 基于 xinetd 服务的启动脚本
* /var/lib/ : 服务产生的数据
* /var/log/ : 日志

命令 service

service --status-all runs all init scripts, in alphabetical order, with the status command.

服务启动和停止

通过 RPM 安装的服务的管理脚本位于 /etc/rc.d/init.d/ 目录,/etc/init.d//etc/rc.d/init.d/ 的符号链接

  • /etc/init.d/<service-name> start | stop | restart | status

  • service <service-name> start | stop | restart | status

服务自启动

  • chkconfig [--level <level>] [service-name] [on|off]

  • 修改 /etc/rc.d/rc.local 文件

  • 使用 ntsysv 管理自启动,可看作 chkconfig 的图形化操作

从源代码安装的服务

启动与停止

<script-absolute-path> start|stop|status|restart

  • 使 service 命令可操作

/etc/rc.d/init.d/ 下创建服务管理脚本的软连接,例如

$ ln -s /usr/local/apache2/bin/apachectl /etc/rc.d/init.d/
$ service apachectl restart

自启动

通过修改 /etc/rc.d/rc.local 文件添加启动命令实现

例如使从源码安装的 apache 服务随系统启动而启动,需要在该文件中添加下面的一行

/usr/local/apache2/bin/apachectl start
  • 使 chkconfig 命令可操作

在服务管理脚本文件添加如下两行(#: 后面各有一个空格)

# chkconfig: <runlevel> <StartOrder> <KillOrder>
# description: <some description>

使 chkconfig 可管理 apache 服务的自启动,配置如下

# chkconfig: 35 96 20
# description: apache installed from source.

<StartOrder><KillOrder> 可根据 /etc/rc.d/rcN.d 下的各软链接的名称确定,避免冲突。