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 v的init、chkconfig、service。同时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-units 及list-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.target和graphical.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
混迹IT行业多年,技术依然渣渣,故名zaza-h
记录和分享自己的学习历程,如果有错漏,请各路大神帮忙指正。也欢迎大家多多讨论,共同成长
本文来自博客园,作者:zaza_h,转载请注明原文链接:https://www.cnblogs.com/zaza-h/p/16251005.html

浙公网安备 33010602011771号