当前位置: 首页 > 科技观察

用Systemd把服务放到Linux的心脏

时间:2023-03-19 16:54:15 科技观察

Linux非常安全可靠,还有一股暗黑少女的味道,可见她也是软乎乎的。在Linux上运行该服务就像男孩将女装藏在密码箱中一样令人放心。它的稳定性和安全性可以使人安然入睡。SPOF是一个著名的单点问题。鉴于xjjdog不喜欢炫耀缩写名词的特点,我在这里打上了它的全名:单点故障。一个Linux是一个单一的Linux,所以运行在它上面的服务会出现单点问题。解决单点问题通常可以通过集群,或者通过奢侈的影子节点来实现。但是无论我们怎么做,我们都希望Linux上运行的某个进程能够在Linux启动时自动启动,在Linux关闭时自动关闭。我们希望我们的应用程序就像Linux的血肉一样,就像安装在Linux的心脏里一样。准备程序很长一段时间,我都是用supervisor做这种事情。但遗憾的是,supervisor并不是linux的预装软件,而且是python写的,需要安装很多依赖包。在网络权限逐渐收紧的企业环境中,使用supervisor只会徒增烦恼。是的,不是主管不好,只是太麻烦了。频繁申请网络权限让人抓狂,甚至压垮主人。下一个最好的事情是systemd。为了说明如何使用它,我们准备了一个小的Java程序:importcom.sun.net.httpserver.HttpContext;导入com.sun.net.httpserver.HttpServer;导入java.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());.close();}catch(Exceptionex){ex.printStackTrace();}});服务器.start();}}此代码将在端口14000上打开一个Http服务器,无论何时访问它,它都会输出Ojbk!.curlhttp://localhost:14000把程序变成服务要让上面的程序成为系统的一部分,需要服务:[Unit]Description=MyFirstJavaServiceAfter=network.targetStartLimitIntervalSec=0[Service]Type=simpleRestart=alwaysRestartSec=1User=rootExecStart=/usr/bin/envjava/opt/Runner[Install]WantedBy=multi-user.target比较重要的是ExecStart,它配置了你要执行的确切命令。当然,我们这里是Simpleclass文件。给这个文件起个名字,比如xjjdogfirstjava.service,然后把这个文件丢到/etc/systemd/system/目录下。启动这个服务直接执行以下命令即可:systemctlstartxjjdogfirstjava如果找不到刚刚创建的服务,记得重新加载:systemctldaemon-reload如果你想让它在Linux下启动,可以执行enable即可创建链接:systemctlenablexjjdogfirstjava除了这两个,disable、stop、restart也是标准命令。注意配置文件中有两行:Restart=alwaysRestartSec=1,表示每当程序异常终止时,进程会自动重启,重启间隔为1秒。更多配置我们注意到在上面的配置文件中,有After=network.target这个词。表示只有启动MySQL时才会启动xjjdogfirstjava服务,即强制指定一个依赖。但是很多小伙伴在使用上面的配置的时候,经常会发现服务自动重启了几次之后,就再也不会重启了。等等,我们不是用了Restart=always参数吗?这是因为systemd默认内置了两个阈值:StartLimitBurst=5StartLimitIntervalSec=10当你将StartLimitIntervalSec设置为0时,目的终于达到了,我们的程序总能失败重启。即便如此,保持一个重启间隔也是一个好习惯。因为大部分服务在重启的时候都会造成服务器资源的增加,如果你不想让你的服务器报警,那就不要这么压迫它。End这是systemd,一个内置于Linux中的程序。有了它,你的应用程序终于可以与Linux集成,并且长盛不衰。