Linux服务管理

早期的System V

    在以前Centos 6的时候,Linux的服务管理都是基于System V来管理的。系统启动的时候,首先运行的就是init这个程序,然后再通过init去启动其他系统服务。

服务的启停与查看

    服务的启动脚本,都是存放于/etc/init.d这个目录下面,这些脚本,基于都是使用 bash shell 编写的。需要启停服务,或者查看服务的运行状态,可以通过下面的方法来处理:

  • 启动服务:/etc/init.d/服务名 start
  • 停止服务:/etc/init.d/服务名 stop
  • 重启服务:/etc/init.d/服务名 restart
  • 查看服务状态:/etc/init.d/服务名 status

系统运行级别

    上面说到 init 是开机后系统内核主动调用的, 然后 init 可以根据用户自定义的运行级别 (runlevel) 来唤醒不同的服务,以进入不同的操作界面。基本上 Linux 提供 7 个执行等级,分别是 0, 1, 2...6 , 比较重要的是 1)单人维护模式、3)纯文本模式、5)文字加图形界面。

    各个运行级别的启动脚本是通过/etc/rc.d/rc[0-6]/SXX服务名 链接到 /etc/init.d/服务名 , 链接文件名 (SXX服务名) 的功能为: S为启动该服务,XX是数字,为启动的顺序。

运行级别 说明
0 关机
1 单用户
2 不完整的多用户(不带网络)
3 完整的多用户,没有桌面,纯命令行
4 未分配,被保留模式
5 x11,完整的图形化界面模式
6 重启

    不能将centos6操作系统的运行级别设置为0或者6,这样关机或者重启后就无法进入系统了。

服务开机自启

    可以通过chkconfig命令,查看服务在各个运行级别下的启动情况。

$ chkconfig --list network
network         0:关    1:关    2:开    3:开    4:开    5:开    6:关

    上面的例子中,网络服务在系统的运行级别为2,3,4,5这几个级别都是“开”,说明Centos在“不完整多用户”,“完整的多用户”,“未分配”,“完整的图形化界面”这几个模式下,都会随着Linux操作系统 的启动,而自动启动network服务。

查看正在运行的服务

    这个可以通过之前学习过的命令:ps命令进行查看。因为服务就是后台运行的一个应用程序呀。

$ ps -aux | grep crond
root        706  0.0  0.0 126384  1664 ?        Ss   21:04   0:00 /usr/sbin/crond -n
root       8352  0.0  0.0 112824   980 pts/0    R+   21:28   0:00 grep --color=auto crond

    也可以通过netstat命令查看

$ netstat -tlun
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN
tcp6       0      0 ::1:25                  :::*                    LISTEN
tcp6       0      0 :::22                   :::*                    LISTEN
udp        0      0 127.0.0.1:323           0.0.0.0:*
udp        0      0 0.0.0.0:68              0.0.0.0:*
udp6       0      0 ::1:323

    但是,如果服务没有监听网络端口,使用netstat命令是查看不出来的(比如crond服务就是没有监听网络端口的服务)。ps命令可能会更好一些。

通过RPM安装的服务,以及手动编译安装的服务之间的区别

    上面的 chkconfig --list 默认只能查看通过RPM包安装的服务。通过RPM安装的服务,相关的配置文件,启动文件等,会约定俗成的放到指定的目录下,比如配置文件会存放到/etc目录,服务的启动文件会存放到/etc/init.d/目录下。但是,通过手动编译的软件包,所有的文件,默认会存放到/usr/local目录下,这样Linux就无法找到相关的脚本去管理服务。

    例如,通过RPM包安装的apache,可以使用命令service httpd start启动apache服务。因为service命令,会在/etc/init.d目录下,查关相关的服务启动文件,然后启动apache服务。但是如果是手工编译安装的MySQL,如果没有将服务配置文件复制到这个目录下,则无法通过service命令启动MySQL服务。

RPM安装的软件目录说明

    通过RPM包安装的软件,相关的软件文件都会按照“约定俗成”的规则,存放到指定的目录,

目录 说明
/etc/init.d/ 启动脚本存放位置
/etc/sysconfig 初始化环境配置文件存放位置
/etc/ 配置文件存放位置
/etc/xinetd.conf 基于xinetd服务的配置文件
/etc/xinetd.d 基于xinetd服务的启动脚本
/var/lib 服务产生的数据存放位置
/var/log 服务日志存放位置

    服务产生的数据,跟服务日志,其实还是有区别的。虽然都是服务在运行中所产生的数据,但是两种数据是不一样的。像mysql的数据库文件,保存的应用的数据,都是服务启动之后所产生的数据。那么这些数据,就存放在/var/lib目录下。那么,服务所产生的日志文件,则会存放在/var/log目录下。

基于RPM包安装服务的启停

    通过service命令,或者通过存放于/etc/init.d目录下的启动脚本,都可以启动基于RPM包安装的软件服务。

基本语法

service 服务名 start|stop|status|restart

或者

/etc/init.d/服务名 start|stop|status|restart

    其实service 命令的工作原理,也是到/etc/init.d目录下,查到有没有跟service命令后面的服务名 同名的启动脚本。所以,另一个角度来理解,服务名,其实也可以理解为 /etc/init.d目录下的启动脚本的文件名。

实例

    启动apache服务

service httpd start

或者

/etc/init.d/httpd start

    查看apache服务的状态

/etc/init.d/httpd status

设置基于RPM包安装服务的开机自启

    上面的服务只是人为的手工启动服务,重启或者关机后,下次再开机,服务就未必会自动启动了,这个时候,可以通过命令,设置服务随着Linux系统的启动而自动启动服务。

基本语法

chkconfig --level [2345] 服务名 on|off

    chkconfig命令,除了能查看服务的开机自启情况之外,还可以设置服务的开机自启。其中,2345为Linux系统的运行级别,因为不能设置Linux操作系统 的运行级别是0和6,否则无法开机呀。2345是可选参数,因为默认的运行级别就是2345呀。

实例

    设置httpd服务开机自启

chkconfig --level 2345 httpd on

    取消httpd服务在运行级别是2,3,4,5这几个级别下的开机自启

chkconfig httpd off

基于源码包编译安装的服务启停

    这个其实可以需要看一下相关的官方文档,不同的软件,手工编译安装好之后,可能启停方法不一样。下面以mysql为例子

服务启停

/usr/local/mysql/bin/mysqld --user=mysql &

    上面的命令就是以mysql用户的身份,启动了mysqld服务。

    因为前面也说过,service命令也是通过,搜索/etc/init.d目录下相关的服务脚本,启停相关的服务。那么,可以通过将mysql的启动脚本,链接到/etc/init.d目录,实现以service命令启停mysql服务的效果。

ln -s /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld

    完成了以上的操作之后,就可以通过service命令启停mysql服务了。

# 停止mysql服务
$ service mysqld stop
Shutting down MySQL.. SUCCESS!

现在的Systemd

    从Centos 7.x以后,Red hat系列的Linux发行版本,放弃了System V的开机启动服务流程,改用了systemd这个启动服务管理机制。systemd就只有一个后台服务systemd以及一个命令systemctl来进行管理,没有了System vinitchkconfigservice。同时systemd也可向下兼容init的启动脚本,旧的init服务启动脚本也可以通过systemd来管理。

systemd的配置文件存放目录

    System v的服务启动脚本,都是存放于/etc/init.d目录下。与此相似,systemd的配置文件,都是存放于/usr/lib/systemd/system这个目录下,但是,除了这个目录外,还有其他的几个目录,也存放了配置文件:

  • /usr/lib/systemd/system/:每个服务最主要的启动脚本设置,有点类似以前的 /etc/init.d 下面的文件;
  • /run/systemd/system/:系统执行过程中所产生的服务脚本,这些脚本的优先序要比/usr/lib/systemd/system/ 高;
  • /etc/systemd/system/:管理员依据主机系统的需求所创建的执行脚本,其实这个目录有点像以前/etc/rc.d/rc5.d/Sxx 之类的功能!执行优先序又比 /run/systemd/system/ 高;

    系统启动的时候会不会自动启动某些服务,主要看/etc/systemd/system/目录下面的设置,该目录下面就是一大堆链接文件。但是Systemd启动服务的脚本,都是存放于/usr/lib/systemd/system//etc/systemd/system/仅是链接到正确的执行脚本配置文件而已。

systemd的服务类型

    先通过实际观察,看看/usr/lib/systemd/system目录下都有些什么东东

$ ll /usr/lib/systemd/system | less
-rw-r--r--. 1 root root  380 10月  8 2021 dbus.service
-rw-r--r--. 1 root root  102 10月  8 2021 dbus.socket
drwxr-xr-x. 2 root root    6 11月  9 13:08 dbus.target.wants
-rw-r--r--. 1 root root 1055 11月  9 13:08 debug-shell.service
lrwxrwxrwx. 1 root root   16 11月  9 13:08 default.target -> graphical.target
drwxr-xr-x. 2 root root    6 11月  9 13:08 default.target.wants
-rw-r--r--. 1 root root  750 6月  22 2018 dev-hugepages.mount
-rw-r--r--. 1 root root  665 6月  22 2018 dev-mqueue.mount
-r--r--r--. 1 root root  345 3月  15 22:13 dm-event.service
-r--r--r--. 1 root root  248 3月  15 22:13 dm-event.socket
-rw-r--r--. 1 root root  457 4月  12 2021 dnf-makecache.service
-rw-r--r--. 1 root root  320 4月  12 2021 dnf-makecache.timer

    通过文件后缀名作为分类,大概可以找到几种比较常见的 systemd 的服务类型:

  • .service:常用的系统服务都是这个类型(service unit)
  • .socket:内部程序数据交换的插槽服务 (socket unit),用于进程间通信;
  • .target:执行环境类型 (target unit),其实是一群 unit 的集合。包括一些.service.socket等;
  • .mount:文件系统挂载相关的服务(mount unit)
  • .automount:文件系统挂载相关的服务(automount unit)
  • .path:检测特定文件或目录类型(path unit),某些服务需要检测某些特定的目录来提供队列服务,例如打印服务就是通过打印队列目录来启动打印功能
  • .timer:由systemd提供的定时服务(timer unit)

使用systemctl启停一个服务

    通过正常的方法,不使用kill结束一个进程/服务:

基本语法

systemctl [参数] 服务名

参数说明

参数 说明
start 启动服务
stop 停止服务
restart 重启服务
reload 不关闭服务的情况下,重新加载配置文件
enable 设置服务下次开机自启
disable 设置服务下次开机不会自启
status 查看服务当前的状态
is-active 查看服务当前是否正在运行
is-enable 查看服务当前是否开机自启

实例

    查看防火墙服务当前的运行状态

$ systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
   Active: active (running) since Fri 2022-04-22 15:50:26 EDT; 2 days ago
     Docs: man:firewalld(1)
 Main PID: 794 (firewalld)
    Tasks: 2 (limit: 23522)
   Memory: 38.7M
   CGroup: /system.slice/firewalld.service
           └─794 /usr/libexec/platform-python -s /usr/sbin/firewalld --nofork --nopid

    重点在以“Loaded”开头的第二行,以及“Active”开头的第三行。

以“Loaded”开头的第二行,决定了这个服务开机的时候会不会自动启动,如果这一行最后面显示 的是enabled,则代表开机自启,如果是disabled,则代表开机不会自动启动。

以“Active”开头的第三行,代表的是这个服务当前的运行状态,如果是active,则代表服务当前正行运行中。如果 是dead,则说明服务当前没有运行。

# 关闭防火墙
$ systemctl stop firewalld

# 取消防火墙开机自启
$ systemctl disable frewalld
Removed /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.

查看系统上所有的服务

    可以通过 list-unitslist-unit-files来观察 当前系统中有多少服务

基本语法

systemctl list-units
# 或者
systemctl list-unit-files

实例

$ systemctl list-unit-files
UNIT FILE                                                                 STATE
opt-hadoop.mount                                                          generated
systemd-ask-password-console.path                                         static
session-9.scope                                                           transient
arp-ethers.service                                                        disabled
auditd.service                                                            enabled
$ systemctl list-units
UNIT                                                                  LOAD   ACTIVE SUB       DESCRIPTION
sys-devices-platform-serial8250-tty-ttyS1.device                      loaded active plugged   /sys/devices/platform/ser>
sys-devices-platform-serial8250-tty-ttyS2.device                      loaded active plugged   /sys/devices/platform/ser>
sys-devices-platform-serial8250-tty-ttyS3.device                      loaded active plugged   /sys/devices/platform/ser>
sys-devices-pnp0-00:05-tty-ttyS0.device                               loaded active plugged   /sys/devices/pnp0/00:05/t>
sys-devices-virtual-misc-rfkill.device                                loaded active plugged   /sys/devices/virtual/misc>
sys-module-configfs.device                                            loaded active plugged   /sys/module/configfs
sys-subsystem-bluetooth-devices-hci0.device

    使用 systemctl list-unit-files 会将系统上所有的服务通通列出来,而不像 list-units 仅以 unit 分类作大致的说明。 至于 STATE 状态就是前两个小节谈到的开机是否会载入的那个状态项目。

    只显示service 这种类别的服务

$ systemctl list-units --type=service --all
UNIT                               LOAD   ACTIVE SUB     DESCRIPTION
auditd.service                     loaded active running Security Auditing Service
chronyd.service                    loaded active running NTP client/server
crond.service                      loaded active running Command Scheduler
dbus.service                       loaded active running D-Bus System Message Bus

通过 systemctl 管理不同的操作环境 (target unit)

    target unit,跟以前System V时代的系统运行级别是有点类似的。先看一下系统有哪些target项目

$ systemctl list-units --type=target --all
UNIT                      LOAD      ACTIVE   SUB    DESCRIPTION
  basic.target              loaded    active   active Basic System
  bluetooth.target          loaded    active   active Bluetooth
  cryptsetup.target         loaded    active   active Local Encrypted Volumes
  emergency.target          loaded    inactive dead   Emergency Mode
  multi-user.target         loaded    active   active Multi-User System
  getty.target              loaded    active   active Login Prompts
  graphical.target          loaded    inactive dead   Graphical Interface
  initrd-fs.target          loaded    inactive dead   Initrd File Systems
  initrd-root-device.target loaded    inactive dead   Initrd Root Device

正常用得比较多的是multi-user.targetgraphical.target,在/etc/inittab文件中也有描述:

  • multi-user.target: analogous to runlevel 3
  • graphical.target: analogous to runlevel 5

查看、修改当前的运行级别

    通过以下命令,可以得到当前的系统运行级别

$ systemctl get-default
multi-user.target

    通过下面的命令 ,可以修改系统的运行级别

$ systemctl set-default multi-user.target

    不重启,直接切换到其他运行模式

$ systemctl isolate multi-user.target

其他用法

    除了修改运行级别外,还有以下这几种用法

# 系统关机
systemctl poweroff 
# 重新开机
systemctl reboot 
# 进入暂停模式
systemctl suspend 
# 进入休眠模式
systemctl hibernate 
# 强制进入救援模式
systemctl rescue 
# 强制进入紧急救援模式
systemctl emergency 
posted @ 2022-05-09 21:27  zaza_h  阅读(256)  评论(0)    收藏  举报