我要提问
ARTICLE DETAIL

资讯详情

前沿编程新知与开发实战干货的深度解读。

linux:systemd之守护进程

linux:systemd之守护进程 环境debian13.7参考《linuxdebian13.7安装.net10》一、systemd 介绍systemd是现代 Linux 系统中一套核心的系统和服务管理器它作为 PID 1 运行负责在内核启动后初始化用户空间并持续管理系统的服务、设备、挂载点、网络、日志等。1.1systemd不只是一个init程序而是一个庞大的工具集包含init 守护进程PID 1启动并管理所有用户空间进程。服务管理器用声明式单元文件管理服务生命周期。日志系统systemd-journald 收集内核和用户空间日志。登录管理systemd-logind 管理用户会话、电源操作。网络管理systemd-networkd、systemd-resolved。时间同步systemd-timesyncd。定时任务systemd.timer 替代 cron。设备管理systemd-udevd 处理内核设备事件。1.2 优点与争议优点启动快、依赖管理强、配置统一。日志集中、查询方便。资源控制、沙箱、安全特性丰富。活跃开发主流发行版默认采用。争议违反 Unix“小而专”哲学功能过于庞大。二进制日志不便于直接用文本工具处理。复杂性高学习曲线陡。与部分发行版和社区理念冲突如 Devuan、Artix 等衍生版专门去除 systemd。1.3 现状主流发行版Ubuntu、Debian、Fedora、RHEL、CentOS、Arch、openSUSE、Deepin、openEuler 等均默认使用 systemd。非 systemd 发行版AlpineOpenRC、Gentoo可选 OpenRC、Voidrunit、Devuansysvinit、Artix多种等。容器与嵌入式systemd 也用于部分容器和嵌入式系统但轻量级替代品如 OpenRC、runit、s6仍有优势。二、配置一个简单的后台服务抛开复杂的功能不谈我们最常用的就是使用 systemd 配置一个后台服务下面我们基于 .net10 的单文件配置一个 web 服务2.1 准备 .net10 单文件 web服务器代码文件:/root/Program.cs#:sdk Microsoft.NET.Sdk.WebvarbuilderWebApplication.CreateBuilder();varappbuilder.Build();// 启动时打印到日志会进入 journaldvaraspnetEnvEnvironment.GetEnvironmentVariable(ASPNETCORE_ENVIRONMENT);varMY_VAREnvironment.GetEnvironmentVariable(MY_VAR);Console.WriteLine($启动环境: ASPNETCORE_ENVIRONMENT{aspnetEnv}, MY_VAR{MY_VAR});app.MapGet(/echo,()$echo{DateTime.Now}\n);app.Run();2.2 写 *.service 文件新建文件/etc/systemd/system/webecho.service[Unit] DescriptionASP.NET Core Echo Web Service (single-file) Afternetwork.target [Service] Typesimple WorkingDirectory/root ExecStart/usr/bin/dotnet run /root/Program.cs EnvironmentASPNETCORE_ENVIRONMENTTest123 EnvironmentMY_VARhello world Restarton-failure RestartSec5 Userroot StandardOutputjournal StandardErrorjournal [Install] WantedBymulti-user.target2.3 重载 systemd 开启web服务配置好后重新加载 systemd 并启动服务systemctl daemon-reload# 重载systemdsystemctl start webecho# 运行服务systemctlenablewebecho# 开机自启动查看日志journalctl-uwebecho-f整体效果如下然后我们换个终端查看服务状态systemctl status webecho.service然后访问下这个web服务curl httpL//localhost:5000/echo这样一个简单的守护进程服务就配置好了即使中间程序挂掉 linux 也会自动拉起并且机器重启也会自动启动。三、systemctl 管理命令3.1 常见命令# 针对一个服务systemctl start webecho# 启动systemctl stop webecho# 停止systemctl restart webecho# 重启systemctl status webecho# 查看服务状态systemctlenablewebecho# 创建符号链接让服务开机自启systemctl disable webecho# 删除符号链接取消开机自启systemctl mask webecho# 把服务链接到 /dev/null彻底禁止启动systemctl unmask webecho# 删除指向 /dev/null 的链接恢复服务systemctlcatwebecho# 查看最终生效的单元文件systemctl edit webecho# 创建 override 片段并编辑systemctl edit--fullwebecho# 编辑完整单元文件systemctl show webecho# 显示所有属性systemctl list-dependencies webecho# 查看依赖关系systemctl reset-failed webecho# 清除失败状态# 不针对具体服务systemctl list-units--typeservice# 列出所有活动服务systemctl list-unit-files--typeservice# 列出所有服务文件及启用状态systemctl daemon-reload# 修改单元文件后必须重载3.2 解释 enable/disable/mask/unmask只针对systemd unit.service 服务文件控制开机自启和能否启动不影响当前正在运行的服务启停是 start/stop3.2.1. systemctl enable xxx.service作用设置开机自动启动本质创建软链接把 unit 加入开机目标multi-user.target.wants 等✅ 开机时自动拉起服务✅ 你依然可以手动systemctl start xxx启动 /stop 停止❗ enable ≠ 现在就运行服务只是配置开机策略systemctlenablemyapp.service3.2.2 systemctl disable xxx.service作用取消开机自动启动本质删除 enable 创建的软链接❌ 开机不再自动启动✅仍然可以手动 start 启动服务systemctl disable myapp.service3.2.3 systemctl mask xxx.service作用彻底锁定、禁止启动服务最强限制本质将服务链接到/dev/null❌ 开机不会启动❌就算手动 systemctl start 也启动失败用来防止意外启动比如冲突服务、废弃服务systemctl mask myapp.service3.2.4 systemctl unmask xxx.service作用解除 mask 锁定删掉指向/dev/null的链接恢复服务文件原始状态unmask 之后才能 start /enablesystemctl unmask myapp.service3.2.5一句话对比表命令开机自启能否手动 start核心目的enable✅ 是✅ 可以设置开机自启disable❌ 否✅ 可以关闭开机自启mask❌ 否❌ 不可以禁止任何方式启动unmask保持原有状态✅解锁后解除 mask 锁定3.2.6 重要组合逻辑mask优先级 enable。mask 之后enable 失效哪怕你 enable 了也无法启动mask 不会自动 disablemask enable 这种组合开机不启动手动也不能启动查看状态# 查看是否开机自启 是否被masksystemctl is-enabled myapp.service返回值enabled已 enable 开机自启disabled已关闭开机自启masked被 mask 锁定3.3 如何新建一个后台服务常用组合为systemctl daemon-reload# 重载systemdsystemctl start webecho# 运行服务systemctlenablewebecho# 开机自启动3.4 如何删除一个后台服务直接删除 .service 文件通常不够因为 systemd 可能还在内存里保留着这个单元而且如果服务正在运行删文件并不会停止进程。正确做法是先停止、禁用、解除屏蔽再删文件最后重载 systemd。正确的删除步骤# 1. 停止正在运行的服务systemctl stop webecho# 2. 取消开机自启删除 enable 生成的符号链接systemctl disable webecho# 3. 如果之前 mask 过先解除屏蔽systemctl unmask webecho# 4. 删除服务文件rm-f/etc/systemd/system/webecho.service# 5. 如果有 override 片段目录也一并删除rm-rf/etc/systemd/system/webecho.service.d# 6. 重新加载 systemd 配置systemctl daemon-reload# 7. 清除失败状态可选systemctl reset-failed webecho四、查看服务日志systemd 日志journalctl你部署 .net echo 服务直接用journald 是 systemd 的日志守护进程日志二进制存储用journalctl查询systemctl status xxx 只会展示最近几行日志详细日志靠 journalctl4.1 最常用# 查看 webecho 服务全部日志journalctl-uwebecho.service# 实时跟踪日志类似 tail -f调试接口最常用journalctl-uwebecho.service-f# 只看本次开机后的 webecho 日志journalctl-uwebecho.service-b# 看上次开机的日志服务上次崩溃重启排查journalctl-uwebecho.service-b-1# 看最近20条日志journalctl-uwebecho.service-n204.2 时间过滤 --since /–until# 最近30分钟日志journalctl-uwebecho.service--since30 min ago# 今天0点至今journalctl-uwebecho.service--sincetoday# 指定时间段journalctl-uwebecho.service--since2026-10-02 07:00:00--until2026-10-02 09:00:004.3 日志级别过滤-p级别0 emerg、1 alert、2 crit、3 err、4 warn、5 notice、6 info、7 debug# 只看错误及更严重err、crit、alert、emergjournalctl-uwebecho.service-perr# 警告到错误区间journalctl-uwebecho.service-pwarn..err4.4 输出格式-o# json格式方便程序解析journalctl-uwebecho.service-ojson-pretty# 精确时间戳journalctl-uwebecho.service-oshort-iso4.4 日志磁盘管理journal 占用清理# 查看journal日志占用大小journalctl --disk-usage# 保留最近500M日志旧的删除journalctl --vacuum-size500M# 只保留最近7天日志journalctl --vacuum-time7d五、其他问题5.1 自己新建个服务它必须以 *.service 后缀吗是的而且必须调用systemctl daemon-reloadsystemd 才会加载的内存5.2 什么是 target*.sevice 中的 WantedBymulti-user.target 是什么意思在 systemd 中target 是一组 unit 的集合用来把系统启动或运行过程中的相关服务、挂载、套接字等组织在一起形成一个同步点或阶段。它本身通常不执行实际工作而是通过依赖关系把其他 unit “拉”起来。target 与 service 的关系:service 是“干活”的单元。target 是“组织”的单元把一组 service 聚合起来。service 通过 WantedBy 声明自己属于哪个 target。target 可以嵌套依赖其他 target形成启动链。那么service 如何和 target 关联起来呢通过 service 文件的WantedBymulti-user.target关联可以通过下面查看依赖以及启动关系systemd-analyze critical-chain5.3 怎么控制服务依赖启动呢5.4 linux一般自带了哪些 service 呢
返回列表