原创:小姐姐味道(微信公众号ID:xjjdog),欢迎分享,转载请保留此信息。
Linux非常的安全、可靠,而且有一股黑黝黝的妹子味道,这说明她也是柔软的。
把服务跑在Linux上,就像男生把女装藏在密码箱里一样让人放心,它的稳定安全可以让人安稳的睡个懒觉。
SPOF,是著名的单点问题。鉴于xjjdog非常讨厌卖弄缩写名词的特点,我把它的全称打在这里:single point of failure。
一台Linux是孤单一台Linux,所以跑在上面的服务,就会有单点问题。解决单点问题通常可以通过集群,也可以通过奢侈的影子节点来达到这个目的。
但无论怎么搞,我们都希望跑在Linux上的某个进程,能够随着Linux的启动自动启动,随着Linux的关闭自动关闭。我们希望自己的应用程序,就像是Linux的血肉一样,就像是安装在Linux的心脏里。
准备程序很长一段时间里,我使用supervisor来做这种事情。但可惜的是,supervisor并不是Linux的预装软件,而且它是python写的,需要装一大堆依赖包。在网络权限逐渐收紧的企业环境中,使用supervisor会给自己徒添烦恼。
是的,并不是supervisor不好,只不过它太麻烦。频繁的网络权限申请让人抓狂,甚至喧宾夺主。
退而求其次,那就是systemd。
为了说明怎么使用它,我们准备一段小小的Java程序。
importcom.sun.net.httpserver.HttpContext; importcom.sun.net.httpserver.HttpServer; importjava.io.OutputStream; importjava.net.InetSocketAddress; publicclassRunner{ publicstaticvoidmain(String[]args)throwsException{ HttpServerserver=HttpServer.create(newInetSocketAddress(14000),0); HttpContextcontext=server.createContext("/"); context.setHandler(exchange->{ try{ Stringresponse="Ojbk!"; exchange.sendResponseHeaders(200,response.getBytes().length); OutputStreamos=exchange.getResponseBody(); os.write(response.getBytes()); os.close(); }catch(Exceptionex){ ex.printStackTrace(); } }); server.start(); } }
这段代码将在14000端口开启一个Http服务器,每当你访问它的时候,它都会输出Ojbk!。
把程序搞成服务
curlhttp://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/目录里。
要启动这个服务的话,直接执行下面的命令就好了。
systemctlstartxjjdogfirstjava
如果你找不到刚刚创建的服务,记得reload一下。
systemctldaemon-reload
如果你想要它随着Linux启动的话,可以执行enable创建一个链接就可以了。
systemctlenablexjjdogfirstjava
除了这两者,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合为一体,天荒地老的伴随下去了。
作者简介:小姐姐味道 (xjjdog),一个不允许程序员走弯路的公众号。聚焦基础架构和Linux。十年架构,日百亿流量,与你探讨高并发世界,给你不一样的味道。
推荐阅读:
1. 玩转Linux2. 什么味道专辑
3. 蓝牙如梦4. 杀机!5. 失联的架构师,只留下一段脚本6. 架构师写的BUG,非比寻常7. 有些程序员,本质是一群羊!
小姐姐味道 不羡鸳鸯不羡仙,一行代码调半天 346篇原创内容 -->
公众号
,