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]部分:

  1. Description:服务的描述信息,可使用systemctl status查看。
  2. After:定义服务启动顺序,确保在网络就绪后再启动本服务。

[Service]部分:

  1. Type=simple:这是最常见的类型,systemd认为该服务进程即为服务的主进程。
  2. ExecStart:最重要的指令,指定启动服务的绝对路径。必须与步骤一中创建的脚本路径完全一致。
  3. Restart=on-failure:指定当服务进程异常退出、被信号终止或超时时,自动重启服务。

[Install]部分:

  1. 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

Read more

【MySQL】第十三节—索引:底层原理、B + 树演进、操作实战

【MySQL】第十三节—索引:底层原理、B + 树演进、操作实战

Hello,好久不见,我是云边有个稻草人-个人主页,与你分享C++领域专业知识! 《MySQL》——本篇文章所属专栏,持续更新中 本文深入解析MySQL索引原理与操作。首先通过实验展示数据默认有序现象,解释Page机制减少IO次数的原理。然后循序渐进分析B+树结构的优势:从单页线性遍历、引入目录到多级目录页构建,最终形成高效的B+树索引。文章对比了B+树与B树、哈希等结构的差异,阐述聚簇索引与非聚簇索引的本质区别。在操作层面,详细介绍了主键索引、唯一索引、普通索引和全文索引的创建与删除方法,并给出索引使用原则:频繁查询字段适合建索引,但更新频繁或唯一性差的字段不宜建索引。最后提及复合索引的最左匹配原则和索引覆盖优化技巧。 【MySQL】第十二节—不懂磁盘与 Page,谈何用好 MySQL 索引?——索引上篇 目录 5. 索引的理解 (1)一个现象和一个结论 (2)循序渐进,理解索引的数据结构为什么选择B+树 第一层—线性遍历效率低下 第二层—引入目录

By Ne0inhk
Android 蓝牙 BLE 扫描 Native 层架构与扫描流程剖析

Android 蓝牙 BLE 扫描 Native 层架构与扫描流程剖析

博主简介 byte轻骑兵,现就职于国内知名科技企业,专注于嵌入式系统研发,深耕 Android、Linux、RTOS、通信协议、AIoT、物联网及 C/C++ 等领域。乐于技术分享与交流,欢迎关注互动! 📌 主页与联系方式ZEEKLOG:https://blog.ZEEKLOG.net/weixin_37800531知乎:https://www.zhihu.com/people/38-72-36-20-51微信公众号:嵌入式硬核研究所邮箱:[email protected](技术咨询或合作请备注需求) ⚠️ 版权声明 本文为原创内容,未经授权禁止转载。商业合作或内容授权请联系邮箱并备注来意。 本文基于 Android 蓝牙源码中 BLE 扫描相关的 Native 层代码,以scanInitializeNative为入口,系统梳理 BLE 扫描从 JNI

By Ne0inhk
Java LLM开发框架全面解析:从Spring AI到Agents-Flex

Java LLM开发框架全面解析:从Spring AI到Agents-Flex

🧑 博主简介:ZEEKLOG博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c=1000,移动端可关注公众号 “ 心海云图 ” 微信小程序搜索“历代文学”)总架构师,16年工作经验,精通Java编程,高并发设计,分布式系统架构设计,Springboot和微服务,熟悉Linux,ESXI虚拟化以及云原生Docker和K8s,热衷于探索科技的边界,并将理论知识转化为实际应用。保持对新技术的好奇心,乐于分享所学,希望通过我的实践经历和见解,启发他人的创新思维。在这里,我希望能与志同道合的朋友交流探讨,共同进步,一起在技术的世界里不断学习成长。 🤝商务合作:请搜索或扫码关注微信公众号 “ 心海云图 ” Java LLM开发框架全面解析:从Spring AI到Agents-Flex 在人工智能席卷全球的今天,Java开发者无需转向Python生态,也能充分利用大语言模型的强大能力,这得益于日益成熟的Java LLM开发框架。 近年来,随着大语言模型(LLM)技术的迅猛发展,AI能力已成为现代应用开发不可或缺的部分。作为企业

By Ne0inhk