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信息等

参考

相关推荐
剑神一笑4 小时前
Linux pgrep 命令详解:按名称查找进程 PID 的高效方法
linux·运维·chrome
剑神一笑5 小时前
Linux killall 命令详解:按进程名批量终止进程的原理与实践
linux·运维·chrome
红尘散仙5 小时前
我把终端小说阅读器接上了 AI Agent:TRNovel 现在能用 skill 生成书源了
人工智能·后端·rust
卷毛的技术笔记6 小时前
告别硬编码!Spring AI Alibaba 实现 AI Agent 智能工具调用(Tool Calling)
java·人工智能·后端·python·spring·ai编程
会编程的土豆7 小时前
Go 语言反射(Reflection)详解
开发语言·后端·golang
喵个咪7 小时前
GoWind Toolkit Go后端代码生成 完整全流程实战
后端·go·orm
basketball6167 小时前
Go 语言从入门到进阶:4. 数组和MAP使用方法总结
开发语言·后端·golang
qq_2518364577 小时前
SpringBoot+Vue 共享电池柜管理系统 完整实现 前后端分离项目实战 完整代码
vue.js·spring boot·后端
zhangxingchao8 小时前
AI 大模型核心六:量化、Workflow 与 Agent、多轮 RAG
前端·人工智能·后端
IT_陈寒9 小时前
Vite打包时遇到的坑,原来问题出在这里
前端·人工智能·后端