Linux知识库
Linux基础知识!
Linux格式化硬盘以及格式化分区
linux基础常用知识
linux更换yum源
linux挂载windows SMB共享目录
linux开机启动级别
linux网卡配置
linux配置SMB服务
CentOS 8 firewalld配置
Linux软件管理:RPM软件包与YUM管理
Linux用户与组概念
Linux文件与目录权限基础
Linux计划任务管理
Linux中文本文件内容的查看
Linux基础-服务(service)和systemd管理服务
Vim编辑器基本操作
apt更换国内源
Linux程序服务!
Code-server在线编程服务器部署
Cloudreve网盘搭建
Emby多媒体影音系统搭建
chevereto图床搭建教程
Frp内网穿透服务器搭建
FTP服务器搭建
gitlab服务器搭建
Plex搭建
syncthing同步服务器搭建
Wordpress博客搭建
Typecho博客搭建
zabbix搭建(失败)
Aria2离线下载服务器搭建
KMS激活服务器搭建
CentOS搭建NTP服务
Grafana部署与Zabbix集成,部署开源IT系统监控平台
Linux应用环境搭建配置!
nginx编译安装
PHP8编译安装
Linux 关闭selinux
yum安装redis数据库
宝塔环境无法删除.user.ini
宝塔面板安装
mysql8.0.29编译安装
nginx安装(yum方式)
Linux系统基础知识
Linux命令行基础知识
使用Cerbot申请免费证书
ModSecurity 安装编译与连接nginx
Zabbix6.4.8安装部署
本文档使用 MrDoc 发布
-
+
首页
Linux基础-服务(service)和systemd管理服务
## 一、服务是什么? 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集合,用于归集一个群组。而不同的类型一般是以**文件后缀名进行区分**。 ```ssh [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/`后面的文件名称。 ```ssh # 以系统服务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:使用的内存 服务的停止与启动: ```ssh # 停止服务 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]` ```ssh # 列出当前启动的服务 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项目: ```ssh [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,切换模式 ```ssh # 查看当前模式 [root@localhost systemd]# systemctl get-default multi-user.target # 切换为图形界面 [root@localhost systemd]# systemctl isolate graphical.target ``` ## 五、service类型服务的配置文件说明 前面大致了解了unit的分类、查看unit的状态,现在来具体查看daemon脚本的内容。 下面以sshd.service为示例: ```ssh [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个部分:**Unit**、**Service**、**Install**。 - 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文件,这些文件配置会累加到默认文件中。
Chuck
2024年4月16日 15:02
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
分享
链接
类型
密码
更新密码