文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2024-12-01 18:53

关注

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也是标配的指令。

注意到配置文件里有这么两行内容:

Restart=always
RestartSec=1

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

更多一些的配置

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

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

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

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

StartLimitBurst=5 
StartLimitIntervalSec=10

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

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

End

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

来源:小姐姐味道内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯