linux Systemd为裸机goLand应用保驾护航

这里是weihubeats ,觉得文章不错可以关注公众号小奏技术,文章首发。拒绝营销号,拒绝标题党

背景

线上有一个Goland的应用程序,goland语言和java不同,如果有任何异常就直接挂掉退出,异常处理要实现 try catch也比较麻烦。

但是部署很方便。因为是脚本语言。启动goland打包好的二进制文件只需要

sh 复制代码
.\main

但是如果进程挂了不会自动重启

Systemd程序

Systemd是linux用来管理应用程序的一个程序。

简单理解就是我们可以通过Systemd去启动一些简单的脚本程序等。

可以实现简单的类似看门狗机制,如果进程挂了会自动帮忙重启

如何通过Systemd启动goland程序

配置服务

  1. 进入/etc/systemd/system目录

  2. 新增一个服务启动文件,比如叫mq.service

sh 复制代码
vim mq.service

填入如下内容

sh 复制代码
[Unit]
Description=MQ Service
After=network.target

[Service]
ExecStart=/data/mq/main
WorkingDirectory=/data/mq
Restart=always

[Install]
WantedBy=multi-user.target

这里简单说明下各个配置的含义

markdown 复制代码
- Unit
   - Description,服务的描述
   - Documentation,文档介绍
   - After,该服务要在什么服务启动之后启动,比如Mysql需要在network和syslog启动之后再启动
- Install
   - WantedBy,值是一个或多个Target,当前Unit激活时(enable)符号链接会放入/etc/systemd/system目录下面以Target名+.wants后缀构成的子目录中
   - RequiredBy,它的值是一个或多个Target,当前Unit激活(enable)时,符号链接会放入/etc/systemd/system目录下面以Target名+.required后缀构成的子目录中
   - Alias,当前Unit可用于启动的别名
   - Also,当前Unit激活(enable)时,会被同时激活的其他Unit
- Service
   - Type,定义启动时的进程行为。它有以下几种值。
   - Type=simple,默认值,执行ExecStart指定的命令,启动主进程
   - Type=forking,以 fork 方式从父进程创建子进程,创建后父进程会立即退出
   - Type=oneshot,一次性进程,Systemd 会等当前服务退出,再继续往下执行
   - Type=dbus,当前服务通过D-Bus启动
   - Type=notify,当前服务启动完毕,会通知Systemd,再继续往下执行
   - Type=idle,若有其他任务执行完毕,当前服务才会运行
   - ExecStart,启动当前服务的命令
   - ExecStartPre,启动当前服务之前执行的命令
   - ExecStartPost,启动当前服务之后执行的命令
   - ExecReload,重启当前服务时执行的命令
   - ExecStop,停止当前服务时执行的命令
   - ExecStopPost,停止当其服务之后执行的命令
   - RestartSec,自动重启当前服务间隔的秒数
   - Restart 指定服务在停止后是否应该自动重新启动
   - TimeoutSec,定义 Systemd 停止当前服务之前等待的秒数
   - Environment,指定环境变量
   - WorkingDirectory 工作目录
   - ExecStart 启动脚本

我们主要是配置了Restart=always,如果服务异常退出就会自动重启 其他的都没怎么配置

这里我们就配置完我们的启动脚本了,接下来我们就看看如何启动

启动服务

sh 复制代码
systemctl start mq.service

systemctl常用命令

sh 复制代码
# 启动服务
systemctl start mq.service
# 查看服务状态
systemctl status mq.service
# 重启服务
systemctl restart mq.service
# 列出正在运行的Unit
systemctl list-units
# 列出所有Unit,包括没有找到配置文件的或者启动失败的
systemctl list-units --all
# 列出所有没有运行的 Unit
systemctl list-units --all --state=inactive
# 列出所有加载失败的 Unit
systemctl list-units --failed

# 列出所有正在运行的、类型为service的Unit
systemctl list-units --type=service
# 重新加载一个服务的配置文件
sudo systemctl reload mq.service

# 重载所有修改过的配置文件
sudo systemctl daemon-reload

查看服务log

perl 复制代码
# 查看所有服务日志
journalctl
# 查看指定时间的日志
journalctl --since="2012-10-30 18:17:16"
journalctl --since "20 min ago"
journalctl --since yesterday
journalctl --since "2015-01-10" --until "2015-01-11 03:00"
journalctl --since 09:00 --until "1 hour ago"

# 显示尾部的最新10行日志
journalctl -n

# 显示尾部指定行数的日志
journalctl -n 20

# 实时滚动查看指定服务最新日志
journalctl -u mq.service -f
# 查看包含指定关键字的服务log
journalctl -u mq.service | grep -i "小奏技术"

log配置

配置文件在/etc/systemd/journald.conf

  • SystemMaxUse:指定journal日志文件占用的最大磁盘空间。当日志文件占用的磁盘空间超过这个值时,旧的日志将被删除。可以使用K、M、G等单位来指定大小。
  • SystemKeepFree:指定journal日志文件系统应该保持的最小可用磁盘空间。当磁盘空间低于这个值时,旧的日志将被删除。
  • SystemMaxFileSize:指定journal日志文件的最大单个文件大小。当单个日志文件的大小超过这个值时,旧的日志将被删除。
  • SystemMaxRetentionSec:指定journal日志文件应该保留的最长时间。超过这个时间的日志将被删除

总结

总的来说使用systemctl去部署一些简单服务还是比较不错的,挂了可以自动拉取,也可以配置log信息等

参考

相关推荐
易协同低代码8 分钟前
通达OA核心类库TD类深度解析
后端
Gopher_HBo10 分钟前
Go语言学习笔记(十八)Gin处理Session
后端
谭光志1 小时前
工具塞满上下文窗口怎么办?深度拆解 AI Agent Tool Search 按需加载实现原理
前端·后端·ai编程
她说..1 小时前
Java 默认值设置方式
java·开发语言·后端·springboot
foggyprojects1 小时前
从0开始,一句话启动AI DataAgent
后端·数据分析·ai编程
郡杰1 小时前
一些基础和问题解决
后端
陈随易1 小时前
前端项目部署只要30秒
前端·后端·程序员
YIAN2 小时前
从零手写文件读取 MCP 服务:一文吃透 Model Context Protocol 全链路通信原理
前端·后端·mcp
Imchendiana2 小时前
《狂人日记NO.9》— 前后端一把梭,我的全栈实录
前端·后端
学渣超2 小时前
记一次分布式事务数据不一致的排查之旅:从超时到索引,层层剥茧
java·后端·架构