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

779 阅读4分钟

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

背景

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

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

.\main

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

Systemd程序

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

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

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

如何通过Systemd启动goland程序

配置服务

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

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

vim mq.service

填入如下内容

[Unit]
Description=MQ Service
After=network.target

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

[Install]
WantedBy=multi-user.target

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

- 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,如果服务异常退出就会自动重启 其他的都没怎么配置

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

启动服务

systemctl start mq.service

systemctl常用命令

# 启动服务
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

# 查看所有服务日志
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信息等

参考