Linux基础-服务(service)和systemd管理服务

本文介绍了Linux系统中的服务概念,重点讲解了systemd服务管理,包括服务类型(如service、socket、target等)、服务文件目录、systemctl命令的使用以及服务的启动、停止、重启操作。还涵盖了如何在systemd中设置服务依赖、配置文件和操作界面环境的切换。
摘要由CSDN通过智能技术生成

一、服务是什么?

Linux中的服务是一种提供某些功能的、常驻在内存中的进程,称为service服务。而Linux中一切皆文件,因此提供服务需要一个文件,而这个文件一般称为daemon。简单说就是一个daemon文件启动,提供某些功能,就称为服务,比如SSH服务、httpd服务、mysqld服务。

二、使用systemd服务

早期通过init进行服务的管理,包括服务的启动、关闭与查看。从CentOS7之后是使用systemd进行服务的管理,因此重点学习systemd即可。

它是Linux下的一种init软件,systemd提供了更快的启动速度和更强大的管理功能,在systemd中,可以通过systemctl命令来管理服务,包括启动、停止、重启、查看状态以及启用和禁用服务等。例如,通过systemctl start命令可以启动一个服务,而systemctl stop命令则可以停止一个服务。

总的来说,systemd为Linux系统提供了一个强大且灵活的系统与服务管理框架,使得系统管理员能够更加方便地管理和维护系统服务。

2.1 服务分类

systemd采用服务单元(Unit)作为管理系统的抽象层,涵盖各类系统资源,如服务(services)、定时任务(timers)、挂载点(mounts)、sockets、设备(devices)、路径(paths)等。每个单元由一个.unit文件(如myservice.service)来描述其属性和行为。

systemd采用服务单位(Unit)来定义一个服务,然后将不同的unit分类为:service、socket、target、path、timer等等。systemd定义了一个target集合,用于归集一个群组。而不同的类型一般是以文件后缀名进行区分

[root@localhost system]# ll | grep -E '(vsftpd|multi|cron)'
-rw-r--r--. 1 root root  356 11月  9 2019 crond.service
-rw-r--r--  1 root root  831 7月  28 2021 multipathd.service
-rw-r--r--  1 root root  186 7月  28 2021 multipathd.socket
-rw-r--r--  1 root root  532 6月  22 2018 multi-user.target
drwxr-xr-x. 2 root root  258 3月   7 2023 multi-user.target.wants
lrwxrwxrwx  1 root root   17 12月 22 2021 runlevel2.target -> multi-user.target
lrwxrwxrwx  1 root root   17 12月 22 2021 runlevel3.target -> multi-user.target
lrwxrwxrwx  1 root root   17 12月 22 2021 runlevel4.target -> multi-user.target
扩展名主要服务功能
.sevice一般服务类型(service unit),包括服务器本身的本地服务和网络服务,大多数都是这种
.socket内部程序数据交换的socket服务(socker unit),使用socket类型的服务较少,一般用于本地程序的交互
.target执行环境类型(target unit),其实就是多个unit的集合,类似于分组是多个服务的集合
.mount/.automount文件系统挂载相关的服务,如网络挂载,NFS挂载等
.timer循环执行的服务(timer unit),类似于cron定时任务,这个是由systemd提供,更加灵活

2.2 服务涉及的目录

unit脚本的存放目录/usr/lib/systemd/system/,每个服务最主要的服务脚本,类似于/etc/init.d下的文件。

/etc/systemd/system/:管理员根据需求建立的执行脚本,可以理解为/usr/lib/systemd/system/的附加或者映射。官方建议是不修改原始启动文件,而是在/etc/systemd/system/添加附加设置覆盖原有设置,但是实际操作中还是直接修改原始文件较多。

三、服务的管理

systemd主要是通过systemctl的命令来实现。

命令格式:systemctl [command] [unit]

command选项:

选项功能
start立刻启动后面接的unit
stop立刻关闭后面接的unit
restart立刻重新启动后面接的unit
reload不关闭后面接的unit,重新加载配置文件,让设置生效
enable设置下次开机时启动,开机自启
disable设置下次开机时不会启动,关闭开机自启
status查看后面接的unit的状态,常用
is-active检查后面的unit有没有运行
is-enable检查后面接的unit有没有开机启动

3.1 使用systemctl查看服务

如果单一服务的查看,直接在后面接服务名称,也就是/usr/lib/systemd/system/后面的文件名称。

# 以系统服务atd为例。
[root@localhost system]# systemctl status atd
● atd.service - Job spooling tools
   Loaded: loaded (/usr/lib/systemd/system/atd.service; enabled; vendor preset: enabled)
   Active: active (running) since Thu 2023-10-05 11:16:03 CST; 6 months 10 days ago
 Main PID: 1191 (atd)
    Tasks: 1 (limit: 49140)
   Memory: 464.0K
   CGroup: /system.slice/atd.service
           └─1191 /usr/sbin/atd -f

Warning: Journal has been rotated since unit was started. Log output is incomplete or unavailable.

大致分为两部分:服务信息和进程信息。

服务信息:

  • Loaded:包含unit文件位置,是否开机自启(enabled/disabled)其它状态(static不自启可以被启动/mask不能被启动),预设下一次是否自启
  • Active:运行状态:active(running/exited/waiting),inactive目前停止运行,以及服务运行时间

进程信息:

  • Main PID:进程ID
  • Memory:使用的内存

服务的停止与启动:

# 停止服务
systemctl stop nginx.service

# 启动服务
systemctl start nginx.service

# 重启服务
systemctl restart nginx.service

3.2 查看系统的所有服务

如果要查看系统上所有的服务可以通过list-units以及list-unit-files查看。

格式为:systemctl [command] [--type=TYPE(|service|socket|target|等)] [--all]

# 列出当前启动的服务
systemctl

UNIT                                                                                      LOAD   ACTIVE SUB       DESCRIPTION                                                                  
  proc-sys-fs-binfmt_misc.automount                                                         loaded active running   Arbitrary Executable File Formats File System Automount Point                
  sys-devices-pci0000:00-0000:00:01.1-ata1-host0-target0:0:1-0:0:1:0-block-sr0.device       loaded active plugged   QEMU_DVD-ROM                                                                 
  sys-devices-pci0000:00-0000:00:04.0-0000:02:01.0-virtio2-block-vda-vda1.device            loaded active plugged   /sys/devices/pci0000:00/0000:00:04.0/0000:02:01.0/virtio2/block/vda/vda1     
  
UNIT : 项目的名称
LOAD : 开机是否自启
ACTIVE : 当前的状态
DSCRIPTION : 详细描述


# 列出所有已安装的unit
systemctl list-unit-files

[root@localhost ~]# systemctl list-unit-files
UNIT FILE                                  STATE          
proc-sys-fs-binfmt_misc.automount          static         
-.mount                                    generated      
boot.mount                                 generated      
dev-hugepages.mount                        static         
dev-mqueue.mount                           static         
home.mount                                 generated      
proc-sys-fs-binfmt_misc.mount              static         
sys-fs-fuse-connections.mount              static         
sys-kernel-config.mount                    static         
sys-kernel-debug.mount                     static         
tmp.mount                                  disabled


# 根据类型筛选,查询service类型的服务
systemctl list-units --type=service

[root@localhost ~]# systemctl list-units --type=service
  UNIT                                                                                      LOAD   ACTIVE SUB     DESCRIPTION                                                                  
  atd.service                                                                               loaded active running Job spooling tools                                                           
  auditd.service                                                                            loaded active running Security Auditing Service                                                    
  chronyd.service                                                                           loaded active running NTP client/server                                                            
  containerd.service                                                                        loaded active running containerd container runtime  

四、切换操作界面环境

以前我记得好像linux得系统级别也就是纯命令行与图形界面级别这些是通过level进行切换的。然后在systemd中可以通过target进行切换。

前面unit分类时候有一个target类别,这个就是跟操作界面有关的项目。

查看target项目:

[root@localhost systemd]# systemctl list-units --type=target --all
  UNIT                      LOAD      ACTIVE   SUB    DESCRIPTION                
● all.target                not-found inactive dead   all.target                 
  basic.target              loaded    active   active Basic System               
  cryptsetup.target         loaded    active   active Local Encrypted Volumes    
  emergency.target          loaded    inactive dead   Emergency Mode             
  getty-pre.target          loaded    inactive dead   Login Prompts (Pre)        
  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         
  initrd-root-fs.target     loaded    inactive dead   Initrd Root File System    
  initrd-switch-root.target loaded    inactive dead   Switch Root                
  initrd.target             loaded    inactive dead   Initrd Default Target      
  local-fs-pre.target       loaded    active   active Local File Systems (Pre)   
  local-fs.target           loaded    active   active Local File Systems         
  multi-user.target         loaded    active   active Multi-User System
  
# 系统已经预设了多种项目,我们只需要简单了解常用的即可
target项目说明
graphical.target命令行+图形界面,默认已经包含multi-user.target
multi-user.target纯命令行模式
rescue.target维护模式
emergency.target紧急模式
shutdown.target关机的模式

模式的切换:

systemctl [command] [unit.target]

command:

  • get-default,获取当前的target
  • set-default,设置默认的target
  • isolate,切换模式
# 查看当前模式
[root@localhost systemd]# systemctl get-default 
multi-user.target

# 切换为图形界面
[root@localhost systemd]# systemctl isolate graphical.target 

五、service类型服务的配置文件说明

前面大致了解了unit的分类、查看unit的状态,现在来具体查看daemon脚本的内容。

下面以sshd.service为示例:

[root@localhost system]# cat sshd.service 
[Unit]
Description=OpenSSH server daemon
Documentation=man:sshd(8) man:sshd_config(5)
After=network.target sshd-keygen.target
Wants=sshd-keygen.target

[Service]
Type=notify
EnvironmentFile=-/etc/crypto-policies/back-ends/opensshserver.config
EnvironmentFile=-/etc/sysconfig/sshd
ExecStart=/usr/sbin/sshd -D $OPTIONS $CRYPTO_POLICY
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartSec=42s

[Install]
WantedBy=multi-user.target

整体分为3个部分:UnitServiceInstall

  • Unit项目本身的描述说明、其它依赖daemon以及启动什么服务再启动设置
  • Service、Socket、Timer、Path,对应不同类型的Unit,不同的unit这里写不同的名称,主要包括服务启动的脚本、环境配置文件、重新启动的方式等。
  • Istall表示将该unit安装到哪个target下。

下面安装三个部分具体分析:

[Unit]部分:

  • Description:服务的说明描述
  • Documentation:相关文档,可以是Documentation=http:xxxx或者Documentation=man sshd等
  • After:说明此服务在哪个服务启动之后才启动,没有强制要求
  • Before:说明此服务在哪个服务启动之前启动,没有强制要求
  • Requires:明确定义此unit在哪个daemon启动之后才能启动,设置依赖服务
  • Wants:与Requires相反,没有强制要求
  • Conflicts:代表冲突的服务,后面接的服务如果启动了则该服务本身不能启动

[Service]部分:

  • Type,说明daemon的启动方式包括:simple默认值,forking父子进程类型,oneshot执行单次关闭,还有notify通知以及其它
  • EnvironmentFile:指定启动脚本的环境配置文件,可以接多个以及设置变量
  • ExecStart:实际脚本命令的启动,一般是脚本+选项+配置文件路径
  • ExecStop:类似于systemctl stop
  • ExecReload:类似于载配置systemctl reload
  • Restart:重启操作,可以配置其它参数设置定时重启?
  • KillMode:有几种方式process结束主进程,control-group由此产生的其它进程也会关闭,none没有进程被关闭

[Install]部分:

  • WantedBy:表示unit安装在哪个操作界面环境中,大多数情况下是multi-user.target中
  • Also:当目前unit本身是开机启动,Also后面接的unit也开机启动,设置关联依赖性启动
  • Alias:运行一个链接的别名

相关的目录:

  • /usr/lib/systemd/system/:官方默认启动脚本文件路径
  • /run/systemd/system/:系统执行过程所产生的服务脚本
  • /etc/systemd/system/:管理员手动增加的配置,映射目录
  • /etc/sysconfig/*:大部分服务都会将初始化选项设置写入该目录
  • /var/lib/:产生数据的服务保存的目录,如mysql数据库
  • /run/:daemon的缓存,包括lock和pid文件等

官方建议使用修改配置过程: 原有目录/usr/liv/systemd/system/sshd.service不修改,在/etc/systemd/system/sshd.service.d/custom.conf下创建同名的目录,添加.d后缀,然后在下面的目录编写.conf文件,这些文件配置会累加到默认文件中。

本文由 mdnice 多平台发布

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不喜欢热闹的孩子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值