news 2026/6/26 10:44:32

使用systemd,把服务装进 Linux 心脏里~

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
使用systemd,把服务装进 Linux 心脏里~

Linux非常的安全、可靠,而且有一股黑黝黝的妹子味道,这说明她也是柔软的。

把服务跑在Linux上,就像男生把女装藏在密码箱里一样让人放心,它的稳定安全可以让人安稳的睡个懒觉。

SPOF,是著名的单点问题。鉴于xjjdog非常讨厌卖弄缩写名词的特点,我把它的全称打在这里:single point of failure。

一台Linux是孤单一台Linux,所以跑在上面的服务,就会有单点问题。解决单点问题通常可以通过集群,也可以通过奢侈的影子节点来达到这个目的。

但无论怎么搞,我们都希望跑在Linux上的某个进程,能够随着Linux的启动自动启动,随着Linux的关闭自动关闭。我们希望自己的应用程序,就像是Linux的血肉一样,就像是安装在Linux的心脏里。

准备程序

很长一段时间里,我使用supervisor来做这种事情。但可惜的是,supervisor并不是Linux的预装软件,而且它是python写的,需要装一大堆依赖包。在网络权限逐渐收紧的企业环境中,使用supervisor会给自己徒添烦恼。

是的,并不是supervisor不好,只不过它太麻烦。频繁的网络权限申请让人抓狂,甚至喧宾夺主。

退而求其次,那就是systemd。

为了说明怎么使用它,我们准备一段小小的Java程序。

import com.sun.net.httpserver.HttpContext; import com.sun.net.httpserver.HttpServer; import java.io.OutputStream; import java.net.InetSocketAddress; public class Runner { public static void main(String[] args) throws Exception{ HttpServer server = HttpServer.create(new InetSocketAddress(14000), 0); HttpContext context = server.createContext("/"); context.setHandler(exchange -> { try { String response = "Ojbk!"; exchange.sendResponseHeaders(200, response.getBytes().length); OutputStream os = exchange.getResponseBody(); os.write(response.getBytes()); os.close(); } catch (Exception ex) { ex.printStackTrace(); } }); server.start(); } }

这段代码将在14000端口开启一个Http服务器,每当你访问它的时候,它都会输出Ojbk!。

curl http://localhost:14000

把程序搞成服务

要想让上面的程序成为系统的一部分,需要将其服务化。

[Unit] Description=My First Java Service After=network.target StartLimitIntervalSec=0 [Service] Type=simple Restart=always RestartSec=1 User=root ExecStart=/usr/bin/env java /opt/Runner [Install] WantedBy=multi-user.target

比较重要的就是ExecStart,它配置了你确切要执行的命令,我们这里当然是一个简单的class文件。

给这个文件起一个名字吧,比如xjjdogfirstjava.service,然后把文件扔进/etc/systemd/system/目录里。

要启动这个服务的话,直接执行下面的命令就好了。

systemctl start xjjdogfirstjava

如果你找不到刚刚创建的服务,记得reload一下。

systemctl daemon-reload

如果你想要它随着Linux启动的话,可以执行enable创建一个链接就可以了。

systemctl enable xjjdogfirstjava

除了这两者,disable、stop、restart也是标配的指令。

注意到配置文件里有这么2行内容。

Restart=always RestartSec=1

它表明,每当程序异常终止的时候,都会自动重启这个进程,重启的间隔是1秒。

更多一些的配置

我们注意到,上面的配置文件里,有After=network.target字样。它表明当MySQL启动完毕的时候,才会启动xjjdogfirstjava服务,也就是强行指定了一个依赖关系。

但很多小伙伴在使用上面配置的时候,经常发现服务自动重启几次之后,就再也不会再重启了。

等等,我们不是使用了Restart=always参数么?

这是由于systemd默认内置了两个阈值。

StartLimitBurst=5 StartLimitIntervalSec=10

当你把StartLimitIntervalSec设置成0的时候,目的就总算达到了,我们的程序可以一直一失败,一直重启下去。

虽然这样,保持一个重启间隔是一个比较好的习惯。因为大多数服务重启的时候,都会造成服务器资源的上升,如果你不想让你的服务器报警,那就不要这么压迫它。

End

这就是systemd,一个Linux内置的程序。有了它,你的应用程序终于能够和Linux合为一体,天荒地老的伴随下去了。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/26 0:47:04

各大互联网公司面经分享:Java 全栈知识 +1500 道大厂面试真题

这篇文章给大家分享一下我遇到的一些质量较高的面试经历,具体经过就不多说了,就把面试题打出来供各位读者老哥参考如有不全的地方,各位海涵。猿辅导八皇后问题求二叉树的最长距离(任意两个节点的路径 中最长的)lru 算法的实现设计一个数据结构…

作者头像 李华
网站建设 2026/6/24 15:43:24

【大厂都在用的周报黑科技】:Open-AutoGLM如何提升90%协作效率?

第一章:周报效率革命的行业背景在数字化转型加速的今天,企业对信息流转效率的要求日益提升。周报作为组织内部沟通的重要载体,正从传统的总结工具演变为驱动决策与协作的关键节点。随着远程办公普及和跨部门协同需求上升,传统手工…

作者头像 李华
网站建设 2026/6/26 9:19:05

还在手动管理日程?用Open-AutoGLM实现全自动提醒,效率翻倍!

第一章:Open-AutoGLM 日程安排提醒Open-AutoGLM 是一个基于 AutoGLM 架构的开源日程管理与智能提醒系统,旨在通过自然语言理解能力自动解析用户输入的任务内容,并生成结构化日程安排。该系统支持多平台同步、语音输入解析以及基于上下文的智能…

作者头像 李华
网站建设 2026/6/26 9:46:40

Open-AutoGLM参会人员通知(内部首发日程曝光)

第一章:Open-AutoGLM参会人员通知(内部首发日程曝光)会议核心议程概览 主题演讲:AutoGLM架构设计理念与开源生态构建技术分论坛:模型微调、推理优化与多模态集成实践闭门研讨:企业级部署中的安全合规挑战关…

作者头像 李华
网站建设 2026/6/26 8:27:24

Open-AutoGLM技术深度解析(会议智能整理新范式)

第一章:Open-AutoGLM技术深度解析(会议智能整理新范式)Open-AutoGLM 是新一代面向会议场景的智能语言理解与生成框架,融合了多模态感知、上下文建模与自动化摘要生成能力,重新定义了会议内容处理的技术边界。该系统基于…

作者头像 李华
网站建设 2026/6/25 21:16:38

别再错过收益波动!构建你的专属Open-AutoGLM收益预警系统(附源码)

第一章:Open-AutoGLM收益预警系统概述Open-AutoGLM收益预警系统是一套基于大语言模型与自动化数据处理技术构建的智能监控平台,专为金融、投资及企业财务场景设计。系统通过实时采集多源异构数据,结合自然语言理解能力,动态识别潜…

作者头像 李华