mirror of
https://gitee.com/dromara/mayfly-go
synced 2026-05-17 00:15:25 +08:00
feat: v1.11.0
This commit is contained in:
205
server/resources/script/README.md
Normal file
205
server/resources/script/README.md
Normal file
@@ -0,0 +1,205 @@
|
||||
# Mayfly-Go 服务管理脚本使用说明
|
||||
|
||||
## 概述
|
||||
|
||||
`mayfly-go.sh` 是 Mayfly-Go 的统一服务管理脚本,支持启动、停止、重启和查看状态等操作。
|
||||
|
||||
## 快速开始
|
||||
|
||||
### 查看帮助
|
||||
|
||||
```bash
|
||||
./mayfly-go.sh
|
||||
```
|
||||
|
||||
### 启动服务
|
||||
|
||||
```bash
|
||||
./mayfly-go.sh start
|
||||
```
|
||||
|
||||
启动后会:
|
||||
- 检查服务是否已在运行
|
||||
- 验证二进制文件是否存在
|
||||
- 自动设置执行权限
|
||||
- 后台启动服务
|
||||
- 保存 PID 到 `mayfly-go.pid`
|
||||
|
||||
### 停止服务
|
||||
|
||||
```bash
|
||||
./mayfly-go.sh stop
|
||||
```
|
||||
|
||||
停止时会:
|
||||
- 优雅关闭服务(发送 SIGTERM)
|
||||
- 最多等待 10 秒
|
||||
- 如无响应则强制关闭(SIGKILL)
|
||||
- 清理 PID 文件
|
||||
|
||||
### 重启服务
|
||||
|
||||
```bash
|
||||
./mayfly-go.sh restart
|
||||
```
|
||||
|
||||
等同于先 stop 再 start。
|
||||
|
||||
### 查看状态
|
||||
|
||||
```bash
|
||||
./mayfly-go.sh status
|
||||
```
|
||||
|
||||
显示服务是否运行及进程 PID。
|
||||
|
||||
## 输出示例
|
||||
|
||||
### 启动
|
||||
```
|
||||
Starting mayfly-go...
|
||||
✓ mayfly-go started successfully (PID: 12345)
|
||||
```
|
||||
|
||||
### 停止
|
||||
```
|
||||
Stopping mayfly-go (PID: 12345)...
|
||||
✓ mayfly-go stopped
|
||||
```
|
||||
|
||||
### 状态(运行中)
|
||||
```
|
||||
● mayfly-go is running (PID: 12345)
|
||||
```
|
||||
|
||||
### 状态(未运行)
|
||||
```
|
||||
○ mayfly-go is not running
|
||||
```
|
||||
|
||||
## 日志查看
|
||||
|
||||
### 启动日志
|
||||
|
||||
启动日志记录服务的启动过程和错误信息:
|
||||
|
||||
```bash
|
||||
# 查看启动日志
|
||||
cat startup.log
|
||||
|
||||
# 实时查看启动日志
|
||||
tail -f startup.log
|
||||
```
|
||||
|
||||
### 运行日志
|
||||
|
||||
服务运行日志由 `config.yml` 中的日志配置决定,请查看配置文件中的日志设置。
|
||||
|
||||
```bash
|
||||
# 根据配置的日志路径查看日志
|
||||
tail -f <your-log-path>
|
||||
|
||||
# 查看最近 100 行
|
||||
tail -n 100 <your-log-path>
|
||||
|
||||
# 搜索错误
|
||||
grep -i error <your-log-path>
|
||||
```
|
||||
|
||||
## 文件说明
|
||||
|
||||
| 文件 | 说明 |
|
||||
|------|------|
|
||||
| `bin/mayfly-go` | 主程序二进制文件 |
|
||||
| `mayfly-go.sh` | 服务管理脚本 |
|
||||
| `mayfly-go.pid` | 进程 PID 文件(自动创建) |
|
||||
| `startup.log` | 启动日志文件(自动创建) |
|
||||
| `config.yml` | 配置文件(包含日志配置) |
|
||||
|
||||
## 故障排查
|
||||
|
||||
### 启动失败
|
||||
|
||||
1. 检查二进制文件是否存在:`ls -la bin/mayfly-go`
|
||||
2. 检查端口是否被占用:`lsof -i :8001`(假设使用 8001 端口)
|
||||
3. 查看启动日志:`cat startup.log`
|
||||
4. 查看配置文件中指定的运行日志路径,检查错误信息
|
||||
|
||||
### 无法正常停止
|
||||
|
||||
如果服务无法正常停止,可以手动清理:
|
||||
|
||||
```bash
|
||||
# 查找进程
|
||||
ps aux | grep mayfly-go
|
||||
|
||||
# 强制杀死进程
|
||||
kill -9 <PID>
|
||||
|
||||
# 清理 PID 文件
|
||||
rm -f mayfly-go.pid
|
||||
```
|
||||
|
||||
### PID 文件不同步
|
||||
|
||||
如果 PID 文件存在但进程不存在,脚本会自动检测并重新创建:
|
||||
|
||||
```bash
|
||||
# 手动清理
|
||||
rm -f mayfly-go.pid
|
||||
|
||||
# 重新启动
|
||||
./mayfly-go.sh start
|
||||
```
|
||||
|
||||
## 高级用法
|
||||
|
||||
### 开机自启动
|
||||
|
||||
**systemd 方式(推荐):**
|
||||
|
||||
创建 `/etc/systemd/system/mayfly-go.service`:
|
||||
|
||||
```ini
|
||||
[Unit]
|
||||
Description=Mayfly-Go Service
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
Type=forking
|
||||
User=mayfly
|
||||
Group=mayfly
|
||||
WorkingDirectory=/opt/mayfly-go
|
||||
ExecStart=/opt/mayfly-go/mayfly-go.sh start
|
||||
ExecStop=/opt/mayfly-go/mayfly-go.sh stop
|
||||
ExecReload=/opt/mayfly-go/mayfly-go.sh restart
|
||||
PIDFile=/opt/mayfly-go/mayfly-go.pid
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
```
|
||||
|
||||
启用并启动服务:
|
||||
|
||||
```bash
|
||||
sudo systemctl enable mayfly-go
|
||||
sudo systemctl start mayfly-go
|
||||
sudo systemctl status mayfly-go
|
||||
```
|
||||
|
||||
**crontab 方式:**
|
||||
|
||||
```bash
|
||||
# 编辑 crontab
|
||||
crontab -e
|
||||
|
||||
# 添加重启后自动启动
|
||||
@reboot /opt/mayfly-go/mayfly-go.sh start
|
||||
```
|
||||
|
||||
## 注意事项
|
||||
|
||||
1. 脚本需要在包含 `mayfly-go` 二进制文件的目录下运行
|
||||
2. 确保有足够的权限执行二进制文件
|
||||
3. 建议不要同时运行多个实例
|
||||
4. 日志配置请在 `config.yml` 中设置
|
||||
186
server/resources/script/mayfly-go.sh
Executable file
186
server/resources/script/mayfly-go.sh
Executable file
@@ -0,0 +1,186 @@
|
||||
#!/bin/bash
|
||||
|
||||
#==============================================
|
||||
# Mayfly-Go Service Manager
|
||||
# 服务管理脚本:支持 start/stop/restart/status
|
||||
#==============================================
|
||||
|
||||
set -e
|
||||
|
||||
# 配置
|
||||
BINARY_NAME="mayfly-go"
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
BINARY_PATH="${SCRIPT_DIR}/bin/${BINARY_NAME}"
|
||||
PID_FILE="${SCRIPT_DIR}/${BINARY_NAME}.pid"
|
||||
CONFIG_FILE="${SCRIPT_DIR}/config.yml"
|
||||
STARTUP_LOG="${SCRIPT_DIR}/startup.log"
|
||||
|
||||
# 颜色输出
|
||||
print_info() {
|
||||
echo -e "\033[1;34m$1\033[0m"
|
||||
}
|
||||
|
||||
print_success() {
|
||||
echo -e "\033[1;32m$1\033[0m"
|
||||
}
|
||||
|
||||
print_error() {
|
||||
echo -e "\033[1;31m$1\033[0m" >&2
|
||||
}
|
||||
|
||||
print_warning() {
|
||||
echo -e "\033[1;33m$1\033[0m"
|
||||
}
|
||||
|
||||
# 获取进程 PID
|
||||
get_pid() {
|
||||
if [ -f "${PID_FILE}" ]; then
|
||||
local pid=$(cat "${PID_FILE}")
|
||||
if ps -p "${pid}" > /dev/null 2>&1; then
|
||||
echo "${pid}"
|
||||
return 0
|
||||
fi
|
||||
fi
|
||||
|
||||
# 回退:通过进程名查找
|
||||
local pid=$(ps aux | grep "${BINARY_PATH}" | grep -v grep | grep -v "$(basename "$0")" | awk '{print $2}' | head -n 1)
|
||||
if [ -n "${pid}" ]; then
|
||||
echo "${pid}"
|
||||
return 0
|
||||
fi
|
||||
|
||||
return 1
|
||||
}
|
||||
|
||||
# 检查服务状态
|
||||
do_status() {
|
||||
local pid
|
||||
if pid=$(get_pid); then
|
||||
print_success "● ${BINARY_NAME} is running (PID: ${pid})"
|
||||
return 0
|
||||
else
|
||||
print_warning "○ ${BINARY_NAME} is not running"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
# 启动服务
|
||||
do_start() {
|
||||
# 检查是否已在运行
|
||||
local pid
|
||||
if pid=$(get_pid); then
|
||||
print_warning "${BINARY_NAME} is already running (PID: ${pid})"
|
||||
return 0
|
||||
fi
|
||||
|
||||
# 检查二进制文件
|
||||
if [ ! -f "${BINARY_PATH}" ]; then
|
||||
print_error "Error: ${BINARY_PATH} not found!"
|
||||
return 1
|
||||
fi
|
||||
|
||||
# 确保可执行权限
|
||||
if [ ! -x "${BINARY_PATH}" ]; then
|
||||
print_info "Setting execute permission..."
|
||||
chmod +x "${BINARY_PATH}"
|
||||
fi
|
||||
|
||||
print_info "Starting ${BINARY_NAME}..."
|
||||
nohup "${BINARY_PATH}" -e "${CONFIG_FILE}" >> "${STARTUP_LOG}" 2>&1 &
|
||||
local new_pid=$!
|
||||
echo "${new_pid}" > "${PID_FILE}"
|
||||
|
||||
# 等待启动
|
||||
sleep 1
|
||||
if ps -p "${new_pid}" > /dev/null 2>&1; then
|
||||
print_success "✓ ${BINARY_NAME} started successfully (PID: ${new_pid})"
|
||||
print_info " Startup log: ${STARTUP_LOG}"
|
||||
return 0
|
||||
else
|
||||
print_error "✗ Failed to start ${BINARY_NAME}"
|
||||
print_error " Check startup log: ${STARTUP_LOG}"
|
||||
rm -f "${PID_FILE}"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
# 停止服务
|
||||
do_stop() {
|
||||
local pid
|
||||
if ! pid=$(get_pid); then
|
||||
print_warning "${BINARY_NAME} is not running"
|
||||
return 0
|
||||
fi
|
||||
|
||||
print_info "Stopping ${BINARY_NAME} (PID: ${pid})..."
|
||||
|
||||
# 优雅关闭
|
||||
kill "${pid}" 2>/dev/null || true
|
||||
|
||||
# 等待进程退出
|
||||
local count=0
|
||||
while ps -p "${pid}" > /dev/null 2>&1; do
|
||||
sleep 0.5
|
||||
count=$((count + 1))
|
||||
if [ ${count} -ge 20 ]; then # 最多等待 10 秒
|
||||
print_warning "Process not responding, force killing..."
|
||||
kill -9 "${pid}" 2>/dev/null || true
|
||||
break
|
||||
fi
|
||||
done
|
||||
|
||||
rm -f "${PID_FILE}"
|
||||
print_success "✓ ${BINARY_NAME} stopped"
|
||||
return 0
|
||||
}
|
||||
|
||||
# 重启服务
|
||||
do_restart() {
|
||||
print_info "Restarting ${BINARY_NAME}..."
|
||||
do_stop
|
||||
sleep 1
|
||||
do_start
|
||||
}
|
||||
|
||||
# 显示帮助
|
||||
do_help() {
|
||||
echo "Usage: $(basename "$0") {start|stop|restart|status}"
|
||||
echo ""
|
||||
echo "Commands:"
|
||||
echo " start Start the service"
|
||||
echo " stop Stop the service"
|
||||
echo " restart Restart the service"
|
||||
echo " status Check service status"
|
||||
echo ""
|
||||
echo "Examples:"
|
||||
echo " $(basename "$0") start"
|
||||
echo " $(basename "$0") stop"
|
||||
echo " $(basename "$0") restart"
|
||||
echo " $(basename "$0") status"
|
||||
}
|
||||
|
||||
# 主函数
|
||||
main() {
|
||||
local command="${1:-}"
|
||||
|
||||
case "${command}" in
|
||||
start)
|
||||
do_start
|
||||
;;
|
||||
stop)
|
||||
do_stop
|
||||
;;
|
||||
restart)
|
||||
do_restart
|
||||
;;
|
||||
status)
|
||||
do_status
|
||||
;;
|
||||
*)
|
||||
do_help
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
main "$@"
|
||||
@@ -1,13 +0,0 @@
|
||||
#bin/bash
|
||||
|
||||
pid=`ps ax | grep -i 'mayfly-go' | grep -v grep | awk '{print $1}'`
|
||||
if [ -z "${pid}" ] ; then
|
||||
echo "No mayfly-go running."
|
||||
exit -1;
|
||||
fi
|
||||
|
||||
echo "The mayfly-go(${pid}) is running..."
|
||||
|
||||
kill ${pid}
|
||||
|
||||
echo "Send shutdown request to mayfly-go(${pid}) OK"
|
||||
@@ -1,17 +0,0 @@
|
||||
#bin/bash
|
||||
|
||||
execfile=./mayfly-go
|
||||
|
||||
pid=`ps ax | grep -i 'mayfly-go' | grep -v grep | awk '{print $1}'`
|
||||
if [ ! -z "${pid}" ] ; then
|
||||
echo "The mayfly-go already running, shutdown and restart..."
|
||||
kill ${pid}
|
||||
fi
|
||||
|
||||
if [ ! -x "${execfile}" ]; then
|
||||
sudo chmod +x "${execfile}"
|
||||
fi
|
||||
|
||||
nohup "${execfile}" &
|
||||
|
||||
echo "The mayfly-go running..."
|
||||
Reference in New Issue
Block a user