Files
s-hy2/scripts/service.sh
T
2025-08-05 14:11:40 +08:00

399 lines
12 KiB
Bash

#!/bin/bash
# Hysteria2 服务管理脚本
# 检查服务状态详情
check_service_detailed() {
echo -e "${CYAN}Hysteria2 服务详细状态:${NC}"
echo ""
if ! check_hysteria_installed; then
echo -e "${RED}Hysteria2 未安装${NC}"
return 1
fi
# 服务状态
echo -e "${BLUE}服务状态:${NC}"
if systemctl is-active --quiet $SERVICE_NAME; then
echo -e " 运行状态: ${GREEN}运行中${NC}"
else
echo -e " 运行状态: ${RED}已停止${NC}"
fi
if systemctl is-enabled --quiet $SERVICE_NAME; then
echo -e " 开机启动: ${GREEN}已启用${NC}"
else
echo -e " 开机启动: ${RED}未启用${NC}"
fi
# 配置文件状态
echo ""
echo -e "${BLUE}配置文件:${NC}"
if [[ -f "$CONFIG_PATH" ]]; then
echo -e " 配置文件: ${GREEN}存在${NC} ($CONFIG_PATH)"
echo -e " 文件大小: $(du -h "$CONFIG_PATH" | cut -f1)"
echo -e " 修改时间: $(stat -c %y "$CONFIG_PATH" 2>/dev/null || stat -f %Sm "$CONFIG_PATH" 2>/dev/null)"
else
echo -e " 配置文件: ${RED}不存在${NC}"
fi
# 端口监听状态
echo ""
echo -e "${BLUE}端口监听:${NC}"
if [[ -f "$CONFIG_PATH" ]]; then
local port=$(grep -E "^listen:" "$CONFIG_PATH" | awk '{print $2}' | sed 's/://')
if [[ -z "$port" ]]; then
port="443"
fi
if netstat -tuln 2>/dev/null | grep -q ":$port "; then
echo -e " 端口 $port: ${GREEN}正在监听${NC}"
else
echo -e " 端口 $port: ${RED}未监听${NC}"
fi
fi
# 进程信息
echo ""
echo -e "${BLUE}进程信息:${NC}"
local pid=$(pgrep -f hysteria)
if [[ -n "$pid" ]]; then
echo -e " 进程ID: ${GREEN}$pid${NC}"
echo -e " 内存使用: $(ps -p $pid -o rss= | awk '{printf "%.1f MB", $1/1024}')"
echo -e " CPU使用: $(ps -p $pid -o %cpu= | awk '{print $1"%"}')"
else
echo -e " 进程状态: ${RED}未运行${NC}"
fi
}
# 启动服务
start_service() {
echo -e "${BLUE}启动 Hysteria2 服务...${NC}"
if ! check_hysteria_installed; then
echo -e "${RED}错误: Hysteria2 未安装${NC}"
return 1
fi
if [[ ! -f "$CONFIG_PATH" ]]; then
echo -e "${RED}错误: 配置文件不存在${NC}"
echo "请先生成配置文件"
return 1
fi
if systemctl is-active --quiet $SERVICE_NAME; then
echo -e "${YELLOW}服务已在运行中${NC}"
return 0
fi
# 启动服务
if systemctl start $SERVICE_NAME; then
echo -e "${GREEN}服务启动成功${NC}"
# 等待服务启动
sleep 2
if systemctl is-active --quiet $SERVICE_NAME; then
echo -e "${GREEN}服务运行正常${NC}"
else
echo -e "${RED}服务启动失败${NC}"
echo "查看日志获取详细信息"
fi
else
echo -e "${RED}服务启动失败${NC}"
fi
}
# 停止服务
stop_service() {
echo -e "${BLUE}停止 Hysteria2 服务...${NC}"
if ! systemctl is-active --quiet $SERVICE_NAME; then
echo -e "${YELLOW}服务未在运行${NC}"
return 0
fi
if systemctl stop $SERVICE_NAME; then
echo -e "${GREEN}服务停止成功${NC}"
else
echo -e "${RED}服务停止失败${NC}"
fi
}
# 重启服务
restart_service() {
echo -e "${BLUE}重启 Hysteria2 服务...${NC}"
if ! check_hysteria_installed; then
echo -e "${RED}错误: Hysteria2 未安装${NC}"
return 1
fi
if [[ ! -f "$CONFIG_PATH" ]]; then
echo -e "${RED}错误: 配置文件不存在${NC}"
return 1
fi
if systemctl restart $SERVICE_NAME; then
echo -e "${GREEN}服务重启成功${NC}"
# 等待服务启动
sleep 2
if systemctl is-active --quiet $SERVICE_NAME; then
echo -e "${GREEN}服务运行正常${NC}"
else
echo -e "${RED}服务重启后未正常运行${NC}"
fi
else
echo -e "${RED}服务重启失败${NC}"
fi
}
# 启用开机自启
enable_service() {
echo -e "${BLUE}启用开机自启...${NC}"
if systemctl is-enabled --quiet $SERVICE_NAME; then
echo -e "${YELLOW}开机自启已启用${NC}"
return 0
fi
if systemctl enable $SERVICE_NAME; then
echo -e "${GREEN}开机自启启用成功${NC}"
else
echo -e "${RED}开机自启启用失败${NC}"
fi
}
# 禁用开机自启
disable_service() {
echo -e "${BLUE}禁用开机自启...${NC}"
if ! systemctl is-enabled --quiet $SERVICE_NAME; then
echo -e "${YELLOW}开机自启未启用${NC}"
return 0
fi
if systemctl disable $SERVICE_NAME; then
echo -e "${GREEN}开机自启禁用成功${NC}"
else
echo -e "${RED}开机自启禁用失败${NC}"
fi
}
# 查看实时日志
view_live_logs() {
echo -e "${BLUE}查看实时日志 (按 Ctrl+C 退出)...${NC}"
echo ""
journalctl -f -u $SERVICE_NAME
}
# 查看历史日志
view_history_logs() {
echo -e "${BLUE}查看历史日志${NC}"
echo ""
echo -e "${GREEN}1.${NC} 最近 50 行"
echo -e "${GREEN}2.${NC} 最近 100 行"
echo -e "${GREEN}3.${NC} 最近 500 行"
echo -e "${GREEN}4.${NC} 今天的日志"
echo -e "${GREEN}5.${NC} 自定义行数"
echo ""
echo -n -e "${BLUE}请选择 [1-5]: ${NC}"
read -r choice
case $choice in
1)
journalctl --no-pager -n 50 -u $SERVICE_NAME
;;
2)
journalctl --no-pager -n 100 -u $SERVICE_NAME
;;
3)
journalctl --no-pager -n 500 -u $SERVICE_NAME
;;
4)
journalctl --no-pager --since today -u $SERVICE_NAME
;;
5)
echo -n -e "${BLUE}请输入行数: ${NC}"
read -r lines
if [[ "$lines" =~ ^[0-9]+$ ]]; then
journalctl --no-pager -n "$lines" -u $SERVICE_NAME
else
echo -e "${RED}无效的行数${NC}"
fi
;;
*)
echo -e "${RED}无效选择${NC}"
;;
esac
}
# 配置文件操作
config_operations() {
echo -e "${BLUE}配置文件操作${NC}"
echo ""
echo -e "${GREEN}1.${NC} 查看配置文件"
echo -e "${GREEN}2.${NC} 编辑配置文件"
echo -e "${GREEN}3.${NC} 备份配置文件"
echo -e "${GREEN}4.${NC} 恢复配置文件"
echo -e "${GREEN}5.${NC} 验证配置文件"
echo ""
echo -n -e "${BLUE}请选择 [1-5]: ${NC}"
read -r choice
case $choice in
1)
if [[ -f "$CONFIG_PATH" ]]; then
echo -e "${BLUE}当前配置文件内容:${NC}"
echo ""
cat "$CONFIG_PATH"
else
echo -e "${RED}配置文件不存在${NC}"
fi
;;
2)
if [[ -f "$CONFIG_PATH" ]]; then
echo -e "${BLUE}使用 nano 编辑配置文件...${NC}"
nano "$CONFIG_PATH"
echo -e "${GREEN}编辑完成${NC}"
echo -n -e "${BLUE}是否重启服务以应用更改? [y/N]: ${NC}"
read -r restart
if [[ $restart =~ ^[Yy]$ ]]; then
restart_service
fi
else
echo -e "${RED}配置文件不存在${NC}"
fi
;;
3)
if [[ -f "$CONFIG_PATH" ]]; then
local backup_file="$CONFIG_PATH.backup.$(date +%Y%m%d_%H%M%S)"
cp "$CONFIG_PATH" "$backup_file"
echo -e "${GREEN}配置文件已备份到: $backup_file${NC}"
else
echo -e "${RED}配置文件不存在${NC}"
fi
;;
4)
echo -e "${BLUE}可用的备份文件:${NC}"
local backups=($(ls "$CONFIG_PATH".backup.* 2>/dev/null))
if [[ ${#backups[@]} -eq 0 ]]; then
echo -e "${RED}没有找到备份文件${NC}"
return
fi
for i in "${!backups[@]}"; do
echo "$((i+1)). ${backups[$i]}"
done
echo -n -e "${BLUE}请选择要恢复的备份 [1-${#backups[@]}]: ${NC}"
read -r backup_choice
if [[ "$backup_choice" =~ ^[0-9]+$ ]] && [[ $backup_choice -ge 1 ]] && [[ $backup_choice -le ${#backups[@]} ]]; then
local selected_backup="${backups[$((backup_choice-1))]}"
cp "$selected_backup" "$CONFIG_PATH"
echo -e "${GREEN}配置文件已恢复${NC}"
else
echo -e "${RED}无效选择${NC}"
fi
;;
5)
if [[ -f "$CONFIG_PATH" ]]; then
echo -e "${BLUE}验证配置文件语法...${NC}"
if hysteria server --config "$CONFIG_PATH" --check 2>/dev/null; then
echo -e "${GREEN}配置文件语法正确${NC}"
else
echo -e "${RED}配置文件语法错误${NC}"
echo "请检查配置文件格式"
fi
else
echo -e "${RED}配置文件不存在${NC}"
fi
;;
*)
echo -e "${RED}无效选择${NC}"
;;
esac
}
# 主服务管理函数
manage_hysteria_service() {
while true; do
echo -e "${BLUE}Hysteria2 服务管理${NC}"
echo ""
# 显示当前状态
check_service_detailed
echo ""
echo -e "${YELLOW}服务操作:${NC}"
echo -e "${GREEN}1.${NC} 启动服务"
echo -e "${GREEN}2.${NC} 停止服务"
echo -e "${GREEN}3.${NC} 重启服务"
echo -e "${GREEN}4.${NC} 启用开机自启"
echo -e "${GREEN}5.${NC} 禁用开机自启"
echo ""
echo -e "${YELLOW}日志查看:${NC}"
echo -e "${GREEN}6.${NC} 查看实时日志"
echo -e "${GREEN}7.${NC} 查看历史日志"
echo ""
echo -e "${YELLOW}配置管理:${NC}"
echo -e "${GREEN}8.${NC} 配置文件操作"
echo ""
echo -e "${RED}0.${NC} 返回主菜单"
echo ""
echo -n -e "${BLUE}请选择操作 [0-8]: ${NC}"
read -r choice
case $choice in
1)
start_service
echo ""
read -p "按回车键继续..."
;;
2)
stop_service
echo ""
read -p "按回车键继续..."
;;
3)
restart_service
echo ""
read -p "按回车键继续..."
;;
4)
enable_service
echo ""
read -p "按回车键继续..."
;;
5)
disable_service
echo ""
read -p "按回车键继续..."
;;
6)
view_live_logs
;;
7)
view_history_logs
echo ""
read -p "按回车键继续..."
;;
8)
config_operations
echo ""
read -p "按回车键继续..."
;;
0)
break
;;
*)
echo -e "${RED}无效选项${NC}"
sleep 1
;;
esac
done
}