Ubuntu下系统服务(Service)管理详解
1.核心概念:什么是服务?
在Ubuntu操作系统中,服务通常指的是在系统后台持续运行的守护进程。它们为操作系统或其他应用程序提供特定的功能支持,例如网络连接(SSH)、Web服务(Nginx/Apache)、数据库(MySQL)或计划任务等。
2.服务管理方式的演进
Ubuntu系统管理服务的方式主要经历了两种体系,其核心区别在于初始化管理系统:
-传统方式(SystemVinit):在Ubuntu14.10及更早版本中作为默认系统。
-现代方式(systemd):自Ubuntu15.04起成为所有后续版本的默认初始化系统。
重要提示:您当前使用的任何主流现代Ubuntu版本(如18.04LTS,20.04LTS,22.04LTS等)均默认采用systemd。
3.两种管理方式的对比
以下表格清晰地列出了两种管理方式的关键区别:
SystemVinit(传统方式)
-服务脚本位置:/etc/init.d/目录下
-核心管理命令示例:sudo /etc/init.d/<服务名> start或sudo service <服务名> start
-设置开机自启命令:sudo update-rc.d <服务名> defaults
-主要适用版本:Ubuntu14.10及更早版本
systemd(现代方式)
-服务脚本位置:/lib/systemd/system/或/etc/systemd/system/目录下(文件以.service结尾)
在Ubuntu系统中,当你使用service abc start命令或者systemctl start abc命令,abc服务通常定义在以下位置:
主要服务文件目录:
- /etc/systemd/system/-用户自定义服务的主要存放目录
- /lib/systemd/system/-系统默认的服务文件存放目录
推荐存放位置:
建议将自定义服务文件放在/etc/systemd/system/目录中,因为这个目录的优先级更高,便于管理和持久化。有用户反馈将服务文件放在/lib/systemd/system/下可能遇到启动问题,而移到/etc/systemd/system/
-核心管理命令示例:sudo systemctl start <服务名>.service
-设置开机自启命令:sudo systemctl enable <服务名>.service
-主要适用版本:Ubuntu15.04及以后的所有版本(当前主流)
4.如何在现代Ubuntu(systemd)中管理服务?
4.1查看服务状态
要检查某个服务(如ssh、nginx)的运行状态,请使用:
sudo systemctl status <服务名>
例如:sudo systemctl status ssh
4.2启动、停止、重启服务
-启动服务:sudo systemctl start <服务名>
-停止服务:sudo systemctl stop <服务名>
-重启服务:sudo systemctl restart <服务名>
-重新加载配置:sudo systemctl reload <服务名>(在不中断服务的情况下应用新配置)
4.3启用/禁用服务开机自动启动
-启用开机自启:sudo systemctl enable <服务名>
-禁用开机自启:sudo systemctl disable <服务名>
4.4查看所有服务
列出系统中所有已加载的服务单元:sudo systemctl list-units --type=service
run@ubuntu:~$ sudo systemctl list-units --type=service
UNIT LOAD ACTIVE SUB DESCRIPTION
accounts-daemon.service loaded active running Accounts Service
acpid.service loaded active running ACPI event daemon
apparmor.service loaded active exited LSB: AppArmor initialization
apport.service loaded active exited LSB: automatic crash report generation
5.关于/etc/init.d/目录的说明
在现代Ubuntu系统中,/etc/init.d/目录依然存在,但其作用已经改变:
-主要目的:用于存放为兼容性而保留的传统SystemVinit脚本。
-工作原理:当您执行sudo service <服务名> start这类旧命令时,系统实际上会将其调用转发给systemd处理,或尝试直接运行该目录下的旧脚本。
-结论:对于在新系统上新配置的服务,其定义文件不应再手动放入/etc/init.d/。您应该学习并优先使用systemctl命令来管理systemd的.service单元文件。
6.总结与操作建议
1.确认您的系统:使用lsb_release –a或者hostnamectl status命令查看Ubuntu版本。绝大多数情况下,您使用的是基于systemd的现代系统。
2.首选管理命令:在日常管理中,优先使用systemctl系列命令(start,stop,status,enable,disable)。
3.处理旧脚本或教程:当遇到要求将脚本放入/etc/init.d/的旧教程或软件包时,应意识到它使用的是传统方法。您可以尝试遵循,但更推荐寻找为该服务适配systemd的现代安装指南。
4.兼容性命令:sudo service <服务名> <动作>命令在大多数情况下仍可使用,它现在是管理systemd服务的一个兼容性入口。
附录:常用服务管理命令速查
-sudo systemctl start nginx-启动Nginx服务
-sudo systemctl stop nginx-停止Nginx服务
-sudo systemctl restart nginx-重启Nginx服务
-sudo systemctl status nginx-查看Nginx状态
-sudo systemctl enable nginx-设置Nginx开机自启
-sudo systemctl disable nginx-取消Nginx开机自启
-sudo systemctl daemon-reload-在修改了某个服务的配置文件后,重新加载systemd配置
5 Ubuntu Systemd实战:创建ZCL验证服务
5.1概述
本指南详细介绍在Ubuntu系统(使用systemd作为初始化系统)中,如何从零开始创建一个名为zcl的验证服务。该服务被设计为一个简单的后台守护进程,通过定期向系统日志打印信息来验证服务创建、管理和运行的整个过程。
前置条件:
系统版本:Ubuntu15.04或更高版本(推荐18.04LTS,20.04LTS,22.04LTS)。
用户权限:需要具备sudo权限以执行系统级操作。
5.2.完整操作步骤
步骤一:创建服务脚本
首先,创建一个将在后台运行并执行具体任务(打印验证信息)的Shell脚本。
1.使用文本编辑器(如nano或者vi)创建脚本文件。建议将脚本放在/usr/local/bin/目录下,该目录通常用于存放本地自定义的可执行文件。
sudo nano /usr/local/bin/zcl-service.sh
2.将以下脚本内容复制并粘贴到文件中。该脚本会在启动时打印一条欢迎信息,然后进入一个循环,每间隔5秒向系统日志输出一次带有时间戳的运行状态。
!/bin/bash
ZCL验证服务脚本
功能:向系统日志持续打印运行状态,用于验证systemd服务配置。
echo"ZCL验证服务启动成功!"
主循环:每5秒打印一次运行状态
whiletrue;do
输出带时间的状态信息
echo"[$(date'+%Y-%m-%d%H:%M:%S')]ZCL服务正在运行..."
等待5秒
sleep5
done
3.保存并关闭文件(在nano编辑器中,按Ctrl+X,然后按Y,最后按Enter)。
4.为脚本文件赋予可执行权限,这是systemd能够直接运行它的必要条件。
sudo chmod +x /usr/local/bin/zcl-service.sh
步骤二:创建Systemd服务单元文件
接下来,创建一个systemd的“单元文件”(UnitFile)来定义如何管理这个脚本。服务单元文件的后缀为.service。
1.在systemd的用户配置目录下创建服务文件。/etc/systemd/system/目录的优先级最高,但是这里参考ubuntu给出的例子,先创建到lib目录下,然后利用软链接映射过去。
sudo nano /lib/systemd/system/zcl.service
2.将以下服务配置内容复制并粘贴到文件中。每一部分的关键参数说明如下:
[Unit]
Description=ZCL验证服务
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/bin/zcl-service.sh
Restart=on-failure
可选参数示例:
RestartSec=5若失败,等待5秒后重启
User=nobody指定运行此服务的用户(非root,更安全)
[Install]
WantedBy=multi-user.target
配置项详解:
[Unit]部分:
- Description:服务的描述信息,可使用systemctl status查看。
- After:定义服务启动顺序,确保在网络就绪后再启动本服务。
[Service]部分:
- Type=simple:这是最常见的类型,systemd认为该服务进程即为服务的主进程。
- ExecStart:最重要的指令,指定启动服务的绝对路径。必须与步骤一中创建的脚本路径完全一致。
- Restart=on-failure:指定当服务进程异常退出、被信号终止或超时时,自动重启服务。
[Install]部分:
- WantedBy=multi-user.target:指定服务安装在哪个“目标”(target)。multi-user.target代表多用户命令行模式,是标准运行级别。
3.保存并关闭文件。
4.在/etc/system/system中建立软连接,具体如下:
root@ubuntu:/etc/systemd/system#sudo ln -sf /lib/systemd/system/zcl.service zcl.service
root@ubuntu:/etc/systemd/system#ls -l zcl.service
lrwxrwxrwx1rootroot31Dec311:04zcl.service->/lib/systemd/system/zcl.service
步骤三:配置与启动服务
创建好单元文件后,需要让systemd识别这个新服务,并对其进行操作
1.重新加载systemd配置。每次新建或修改.service文件后,都必须执行此命令,使新的或更改过的配置生效。
sudo systemctl daemon-reload
2.启动zcl服务。
sudo systemctl start zcl
3.(可选但建议)启用开机自动启动。此命令会在multi-user.target中创建符号链接,使得系统启动时能自动运行该服务。
sudo systemctl enable zcl
成功执行后,通常会输出:
Createdsymlink/etc/systemd/system/multi-user.target.wants/zcl.service→/etc/systemd/system/zcl.service.
步骤四:验证服务运行状态
服务启动后,需要通过多种方式验证其是否按预期运行。
1.检查服务状态:这是最直接的方式,可以查看服务是否活跃、运行时间以及最新的日志片段。
sudo systemctl status zcl
预期成功状态:命令行输出的首行应显示Active:active(running)since...。
2.实时跟踪服务日志:使用journalctl命令可以实时查看服务通过echo或logger命令输出的所有信息(即来自stdout和stderr的内容)。
sudo journalctl -fu zcl
-f:跟踪日志末尾,并持续显示新条目。
-u:过滤指定单元(服务)的日志。
预期输出:您将看到脚本中定义的周期性消息[YYYY-MM-DDHH:MM:SS]ZCL服务正在运行...每隔5秒出现一次。按Ctrl+C可退出日志跟踪模式。
3.服务管理命令速查表
创建并启动服务后,您可以使用以下命令进行日常管理:
|功能|命令|说明|
|:---|:---|:---|
|启动服务|sudo systemctl start zcl|立即启动服务。|
|停止服务|sudo systemctl stop zcl|立即停止服务。|
|重启服务|sudo systemctl restart zcl|先停止再启动服务。|
|查看状态|sudo systemctl status zcl|查看服务的详细运行状态。|
|禁用自启|sudo systemctl disable zcl|取消开机自动启动,但不影响当前运行。|
|查看日志|sudojournalctl –u zcl|查看该服务的所有日志。|
4.故障排查指南
如果服务未能成功运行,请按顺序检查以下常见问题:
1.检查脚本权限与路径:
确认脚本路径/usr/local/bin/zcl-service.sh是否与zcl.service文件中的ExecStart=完全一致。
确保脚本拥有可执行权限(执行ls –l /usr/local/bin/zcl-service.sh查看,开头应为-rwxr-xr-x)。
2.分析服务状态信息:
仔细阅读sudo systemctl status zcl命令的输出。红色字样的Failed错误信息和下方的日志提示通常是解决问题的关键。
3.验证服务文件语法:
可以使用systemd-analyze工具检查服务文件是否有语法错误。
systemd-analyz everify /etc/systemd/system/zcl.service
如果没有任何输出,则表示语法正确。
4.服务类型不匹配:
如果您的脚本是一个只执行一次就退出的程序(例如打印一句话),那么需要将zcl.service文件中的Type=simple修改为Type=oneshot。
对于当前示例中的循环脚本,Type=simple是正确的。
5.清理服务(如需删除)
如果您需要完全移除zcl服务,请按顺序执行以下命令:
1.停止正在运行的服务
Sudo systemctl stop zcl
2.禁用开机自启(移除符号链接)
Sudo systemctl disable zcl
3.删除服务单元文件
Sudo rm /lib/systemd/system/zcl.service
4.重载systemd配置,使其“忘记”这个服务
Sudo systemctl daemon-reload
5.(可选)删除之前创建的脚本文件
Sudo rm /usr/local/bin/zcl-service.sh