这里是weihubeats ,觉得文章不错可以关注公众号小奏技术,文章首发。拒绝营销号,拒绝标题党
背景
线上有一个Goland
的应用程序,goland
语言和java
不同,如果有任何异常就直接挂掉退出,异常处理要实现 try catch
也比较麻烦。
但是部署很方便。因为是脚本语言。启动goland
打包好的二进制文件只需要
sh
.\main
但是如果进程挂了不会自动重启
Systemd程序
Systemd
是linux用来管理应用程序的一个程序。
简单理解就是我们可以通过Systemd
去启动一些简单的脚本程序等。
可以实现简单的类似看门狗机制,如果进程挂了会自动帮忙重启
如何通过Systemd启动goland程序
配置服务
-
进入
/etc/systemd/system
目录 -
新增一个服务启动文件,比如叫
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信息等