服务(Service)
在Linux操作系统中,服务(Service)是一个基本概念,它通常指的是运行在后台的、持续提供特定功能或资源给系统内部组件或者网络上的客户端程序。
这些服务是系统正常运行和提供各种功能的关键组成部分,它们可以按照预定义的启动顺序自动加载,并在整个系统运行期间保持活动状态。
常见的Service
系统基础服务:
systemd:现代Linux发行版普遍采用的初始化系统,负责启动、停止和管理系统中的各种服务及进程。
cron 或 anacron:定时任务调度服务,用于按照预定时间执行命令或脚本。
syslog 或 rsyslog:日志记录服务,收集并管理系统的各种日志信息。
networking 或 network-manager:网络配置与管理服务,负责系统网络接口的启动和连接设置。
网络服务:
sshd:安全外壳(SSH)服务器,提供远程登录、文件传输等功能。
httpd 或 nginx:Web服务器,用于托管网站内容和服务HTTP请求。
dhcpd:动态主机配置协议(DHCP)服务器,自动分配IP地址给局域网内的客户端设备。
bind 或 dnsmasq:域名系统(DNS)服务器,处理域名解析请求。
smtpd(例如Postfix或Exim):邮件发送服务,实现电子邮件的发送功能。
数据库服务:
mysqld 或 mariadb-server:MySQL或MariaDB数据库服务器。
postgresql:PostgreSQL数据库服务器。
mongodb:MongoDB文档型数据库服务器。
文件共享服务:
nfs-server:网络文件系统(NFS)服务器,允许网络中的其他计算机通过网络挂载并访问本地文件系统。
samba:SMB/CIFS文件共享服务,支持Windows和其他操作系统之间的文件和打印共享。
身份验证与授权服务:
ldap 或 slapd:轻量级目录访问协议(LDAP)服务器,用于集中式用户和组账户管理。
krb5 或 kdc:Kerberos身份验证服务,提供网络安全认证。
虚拟化服务:
libvirtd 或 virt-manager:基于libvirt的虚拟机管理工具及相关服务。
容器管理服务:
docker:流行的容器引擎,用于部署和运行应用程序的容器化环境。
containerd 或 cri-o:容器运行时环境服务,为容器提供底层支持。
监控与性能分析:
snmpd:简单网络管理协议(SNMP)守护程序,提供网络设备状态监测。
prometheus 或 node_exporter:监控与警报系统,收集并展示系统和应用指标。
安全相关服务:
firewalld 或 iptables:防火墙服务,控制进出系统的网络流量。
fail2ban:防止恶意登录尝试的安全工具。
uwsgi 或 apache mod_wsgi:Web应用服务器中间件,用于托管Python等语言编写的Web应用程序。
Linux服务特点:
持久性:服务通常是长期运行的,不会因为用户注销或终端会话结束而停止运行。
后台运行:服务不依赖于用户的交互操作,它们在后台作为守护进程(Daemon)执行。
系统核心功能支持:一些服务直接与内核相关联,比如网络服务、文件系统服务、打印服务等,它们确保了系统的基础设施正常运作。
管理与控制:Linux系统通过init系统(如Systemd、SysV init或其他init替代品)来管理和控制服务的启动、停止、重启以及查看其运行状态等。
延伸:服务单元分类
Service命令
在Linux系统中,服务的配置文件通常放在/etc/init/或者/etc/init.d/目录下,具体取决于你的系统使用的是Upstart还是Systemd。
对于Systemd(现代Linux系统的初始化系统),服务单元通常有.service扩展名,例如sshd.service。这些.service文件存放在/etc/systemd/system/目录。
对于Upstart(早期Ubuntu系统使用的初始化系统),服务脚本通常有.conf扩展名,例如ssh.conf。Upstart的配置文件存放在/etc/init/目录。
作用:service命令可以启动、停止、重新启动和关闭系统服务,还可以显示所有系统服务的当前状态。
1.格式:service <service>
打印指定服务<service>的命令行使用帮助。
2.格式:service <service> start
启动指定的系统服务<service>
3.格式:service <service> stop
停止指定的系统服务<service>
4.格式:service <service> restart
重新启动指定的系统服务<service>,即先停止(stop),然后再启动(start)。
5.格式:chkconfig --list
查看系统服务列表,以及每个服务的运行级别。
6.格式:chkconfig <service> on
设置指定服务<service>开机时自动启动。
7.格式:chkconfig <service> off
设置指定服务<service>开机时不自动启动。
8.格式:ntsysv
以全屏幕文本界面设置服务开机时是否自动启动。
- 查看系统服务的状态:
service --status-all
chkconfig命令
chkconfig是管理系统服务(service)的命令行工具。所谓系统服务(service),就是随系统启动而启动,随系统关闭而关闭的程序。
chkconfig可以更新(启动或停止)和查询系统服务(service)运行级信息。更简单一点,chkconfig是一个用于维护/etc/rc[0-6].d目录的命令行工具。
chkconfig 是一个用来管理 Red Hat 及其衍生系统如 CentOS 中的启动项的命令行工具。如果你的系统中没有 chkconfig 命令,可能是因为你使用的是基于 Debian 的系统(如 Ubuntu),在这种系统中通常使用 update-rc.d 命令来管理启动项.
设置service开机是否启动:
chkconfig name on/off/reset
on表示开启,off表示关闭,reset表示重置。
设置service运行级别
chkconfig --level levels
等级0表示:表示关机
等级1表示:单用户模式
等级2表示:无网络连接的多用户命令行模式
等级3表示:有网络连接的多用户命令行模式
等级4表示:不可用
等级5表示:带图形界面的多用户模式
等级6表示:重新启动
列出service启动信息
chkconfig --list [name]
如果不指定name,会列出所有services的信息
chkconfig [--add][--del][--list][系统服务]
chkconfig --add <名称>
chkconfig --del <名称>
--add增加所指定的系统服务,让chkconfig指令得以管理它,并同时在系统启动的叙述文件内增加相关数据。
--del删除所指定的系统服务,不再由chkconfig指令管理,并同时在系统启动的叙述文件内删除相关数据。
systemctl 命令
systemctl 是一个用于检视和控制 systemd 系统和服务管理器的命令行工具。systemd 是用于启动、停止和管理 Linux 系统中的服务的守护进程。
systemd配置目录有以下三种 :
/usr/lib/systemd/system/:每个服务最主要的启动脚本设置,该目录存放软件默认的配置,不建议修改
/run/systemd/system/:系统执行过程中所产生的服务脚本,这些脚本的优先级要比
/usr/lib/systemd/system/ 高
/etc/systemd/system/:管理员依据主机系统的需求所创建的执行脚本,执行优先级又比 /run/systemd/system/ 高
因此用户自定义的服务、修改的配置文件一般放在/etc/systemd/system/目录
/etc/systemd/system/目录下存放的是需要开机执行的服务,该目录下有大量的链接文件,链接到/usr/lib/systemd/system/目录下,该目录下的文件才是systemd实际启动的服务脚本文件。可通过ll命令查看,即/etc/systemd/system/存放的是链接快捷方式,/usr/lib/systemd/system/才是实际启动的服务脚本
如:
以vsftpd.service为例,如果要对其进行修改,可以在以下目录中进行操作。
/usr/lib/systemd/system/vsftpd.service:官方的默认配置文件;/etc/systemd/system/vsftpd.service.d/custom.conf:在 /etc/systemd/system 下面创建与配置文件相同文件名的目录,但是要加上 .d 的扩展名。然后在该目录下创建配置文件即可。配置文件后缀最好为 .conf 。该目录下的文件会附件进入/usr/lib/systemd/system/vsftpd.service
/etc/systemd/system/vsftpd.service.wants/*:此目录内的文件为链接文件,设置依赖服务的链接。意思是启动了 vsftpd.service 之后,最好再启动这目录下面建议的服务。/etc/systemd/system/vsftpd.service.requires/*:此目录内的文件为链接文件,设置依赖服务的链接。意思是在启动 vsftpd.service 之前,需要事先启动哪些服务的意思。
systemctl命令是系统服务管理器指令,它实际上将 service 和 chkconfig 这两个命令组合到一起
格式:systemctl [OPTIONS] COMMAND [UNIT]
OPTIONS: 可选参数,用于指定 systemctl 的行为。
COMMAND: 必需参数,用于执行特定的 systemd 命令,例如启动、停止或重新启动服务。
UNIT: 可选参数,用于指定要操作的服务或单元。
常用选项
-H, --host: 指定要在远程主机上运行的 systemd 实例的主机名或 IP 地址。
-a, --all: 显示所有已加载的单位,而不仅仅是当前活动的单位。
-t, --type: 根据指定的单元类型筛选单元列表。支持的单元类型包括 service、socket、mount 等。
-u, --user: 执行与当前用户相关联的用户级服务。
常见的命令:
- 列出所有可用单元:
systemctl list-unit-files
- 检查某个单元是否开机自启动:
systemctl is-enabled 服务名
- 检查某个服务的运行状态
systemctl status 服务名
Loaded:该行表示此服务是否会开机启动,Loaded有如下:
- enabled:这个 服务将在开机时被执行
- disabled:这个 daemon 在开机时不会被执行
- static:这个 daemon 不可以自己启动 (enable 不可),不过可能会被其他的 enabled的服务来唤醒
- mask:这个 daemon 无论如何都无法被启动!因为已经被强制注销 (非删除)。
- vendor preset表示第一次安装时的预设值。
Active:现在这个服务单元的状态是正在执行 (running) 或没有执行 (dead)。如下
-
active (running):正有一只或多只程序正在系统中执行的意思
-
active (exited):仅执行一次就正常结束的服务,目前并没有任何程序在系统中执行。
-
active (waiting):正在执行当中,不过还再等待其他的事件才能继续处理。
-
inactive:这个服务目前没有运行。
-
列出所有服务:
systemctl list-unit-files --type=service
- 启动,停止,重启、重新加载服务配置服务
systemctl start 服务名
systemctl stop 服务名
systemctl restart 服务名 //重启服务
systemctl reload 服务名 //reload是在不重启服务的情况下重新加载配置文件
- 查询服务是否激活
systemctl is-active 服务名
- 配置是否开机自启动
systemctl disable 服务名 //开机不启动
systemctl enable 服务名 //开机启动
- 使用systemctl命令杀死服务
systemctl kill 服务名
列出指定服务的所有依赖项和服务间的启动顺序关系
systemctl list-dependencies 服务名
如:systemctl list-dependencies ssh.service
查看哪些服务的运行依赖于本服务
systemctl list-dependencies 服务名 --reverse
如:systemctl list-dependencies ssh.service --reverse
- 重新加载Systemd配置
systemctl daemon-reload
命令参数 参数说明
start 立刻启动后面接的unit
stop 立刻关闭后面接的unit
restart 立刻关闭后启动后面接的unit,亦即执行stop再start的意思
reload 不关闭后面接的unit的情况下,重载配置文件,让设定生效
enable 设定下次开机时,后面接的unit会被启动
disable 设定下次开机时,后面接的unit 不会被启动
status 目前后面接的这个unit 的状态,会列出是否正在执行、是否开机启动等信息。
is-active 目前有没有正在运行中
is-enable 开机时有没有预设要启用这个unit
kill 不要被kill这个名字吓着了,它其实是向运行unit的进程发送信号
show 列出unit的配置。
mask 注销unit,注销后你就无法启动这个unit了
unmask 取消对unit的注销
list-units 依据unit列出目前有启动的unit。若加上--all才会列出没启动的。(等价于无参数)
list-unit-files 列出所有以安装unit以及他们的开机启动状态(enabled、disabled、static、mask)。
--type=TYPE 就是unit type,主要有service,socket,target等
get-default 取得目前的 target
set-default 设定后面接的 target 成为默认的操作模式
isolate 切换到后面接的模式
编写.service
.service文件通常由三部分组成:
[Unit]: 定义与Unit类型无关的通用选项;用于提供unit的描述信息,unit行为及依赖关系等。
[Service]:与特定类型相关的专用选项;此处为Service类型。
[Install]:定义由"systemctl enable"及"systemctl disable"命令在实现服务启用或禁用时用到的一些选项。
Unit段的常用选项
Description:描述信息,意义性描述;
After:定义unit的启动次序;表示当前unit应晚于哪些unit启动;其功能与Before相反;
Before:表示当前unit应先于哪些unit启动。
Requies:被依赖的units无法启动时,当前的unit即无法启动;
Wants:当前这个units启动后最好还要启动其他的units比较好。
Confilcts:定义units 的冲突关系;只能二选一启动。
Service段的常用选项
Type:用于定义影响ExecStart及相关参数的功能的unit进程类型;
类型有:
simple:默认值,指定ExecStart字段的进程为主进程
forking:开子进程执行, 原生父进程结束后就会终止子进程运行。
Oneshot:执行一次
Dbus:
Notify:启动后发送会发送通知信号通知systemd
Idle:等其他任务结束后才运行
EnvironmentFile:环境配置文件;
ExecStart:指明启动unit要运行的命令或脚本;ExecStart, ExecStartPost
ExecStop:指明停止unit要运行的命令或脚本;
Restart:
可选项 描述
no 退出后不会重启
on-success 当进程正常退出时(退出码为0) 执行重启
on-failure 当进程不正常退出时(退出码不为0) 执行重启
on-abnormal 当被信号终止和超时执行重启
on-abort 当收到没有捕捉到的信号终止时执行重启
on-watchdog 当看门狗超时时执行重启
always 一直重启
KillMode
可选项 描述
control-group 杀掉当前进程中所有的进程
Process 杀掉当前进程的主进程
Mixed 主进程将收到 SIGTERM 信号,子进程收到 SIGKILL 信号
None 不杀掉任何进程
TimeoutSec:此服务在启动或关闭时,因为某些原因无法顺利正常启动或结束,在等待多久进入强制结束的状态。
Install段的常用配置:
Alias:一个链接的,别名,
RequiredBy:依赖哪些unit;
WantBy:被哪些unit所依赖;一般是*.target unit
一般填为WantedBy=multi-user.target
例子:pgsql.service
[Unit]
Description=PostgreSQL database server
After=network.target
[Service]
Type=forking
User=postgres
Environment=PGSTARTTIMEOUT=200
Environment=PGDATA=/usr/local/pgsql/data
ExecStart=/usr/local/pgsql/bin/pg_ctl start -D ${PGDATA} -s -w -t ${PGSTARTTIMEOUT}
ExecStop=/usr/local/pgsql/bin/pg_ctl stop -D ${PGDATA} -s -m fast
ExecReload=/usr/local/pgsql/bin/pg_ctl reload -D ${PGDATA} -s
TimeoutSec=500
[Install]
WantedBy=multi-user.target
自定义自启动服务
新建test.service并编辑服务单元文件内容
[Unit]
Description=test Service
After=network.target
[Service]
Type=simple
ExecStart=/root/study/test/test
Restart=always
[Install]
WantedBy=multi-user.target
把该test.service放到 /etc/systemd/system目录下
修改test.service的权限,使其可执行 chmod 777 test.service
在终端输入下面命令,使重新加载Systemd配置
sudo systemctl daemon-reload
设置开机自启动服务
sudo systemctl enable test.service
(可选)立即启动服务
sudo systemctl start test.service