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

参考

相关推荐
间彧几秒前
在实际项目中,如何根据具体业务场景选择合适的并发容器?
后端
无泪无花月隐星沉1 小时前
uos server 1070e lvm格式磁盘扩容分区
linux·运维·uos
食咗未1 小时前
Linux USB HOST EXTERNAL STORAGE
linux·驱动开发
食咗未1 小时前
Linux USB HOST HID
linux·驱动开发·人机交互
Xの哲學1 小时前
Linux SLAB分配器深度解剖
linux·服务器·网络·算法·边缘计算
码界奇点2 小时前
基于Spring Boot的内容管理系统框架设计与实现
java·spring boot·后端·车载系统·毕业设计·源代码管理
a努力。2 小时前
字节Java面试被问:系统限流的实现方式
java·开发语言·后端·面试·职场和发展·golang
齐鲁大虾3 小时前
UOS(统信操作系统)如何更新CUPS(通用Unix打印系统)
linux·服务器·chrome·unix
虾..4 小时前
Linux 简单日志程序
linux·运维·算法
小高Baby@4 小时前
使用Go语言中的Channel实现并发编程
开发语言·后端·golang