feat(vps-xray): 新增 --restart 轻量入口

只改定时重启计划并立即生效,不重装 Xray、不重写配置、不重启服务,
与 --mode/--show/--redetect 互斥。
顺带修正非法参数以退出码 0 结束的问题。
This commit is contained in:
2026-08-06 17:02:15 +08:00
parent 682b79852d
commit 9f1e293d4c
+86 -2
View File
@@ -31,8 +31,13 @@ usage() {
echo " --show 只读取 .env 打印连接信息和分享链接,不改动任何服务"
echo " --redetect 强制重新挑选 Reality 伪装目标(会改变 SNI"
echo " 所有客户端链接都必须同步更新)"
echo " --restart [N] [HH:MM]"
echo " 只修改定时重启计划并立即生效。N=0 关闭。"
echo " 不重装 Xray、不重写配置、不重启服务,"
echo " 现有 vless 链接完全不受影响。"
echo " 例: bash deploy.sh --restart 7 04:00"
echo " -h, --help 显示帮助"
exit 0
exit "${1:-0}"
}
# ===== 解析参数 =====
@@ -40,16 +45,40 @@ MODE=""
MODE_EXPLICIT=0
SHOW_ONLY=0
REDETECT=0
RESTART_ONLY=0
RESTART_ARG_DAYS=""
RESTART_ARG_TIME=""
while [[ $# -gt 0 ]]; do
case $1 in
--mode) MODE="${2:-}"; MODE_EXPLICIT=1; shift 2 ;;
--show) SHOW_ONLY=1; shift ;;
--redetect) REDETECT=1; shift ;;
--restart)
RESTART_ONLY=1
shift
# 后面可跟 0~2 个位置参数,按形态判断,不会误吞后续选项
if [[ "${1:-}" =~ ^[0-9]+$ ]]; then
RESTART_ARG_DAYS="$1"
shift
if [[ "${1:-}" =~ ^([01]?[0-9]|2[0-3]):[0-5][0-9]$ ]]; then
RESTART_ARG_TIME="$1"
shift
fi
fi
;;
-h|--help) usage ;;
*) error "未知参数: $1"; usage ;;
*) error "未知参数: $1"; usage 1 ;;
esac
done
# --restart 是「只改重启计划」的轻量入口,与会改动服务的选项互斥,
# 避免用户以为只调了 timer、实际却顺带重装了 Xray
if [ "$RESTART_ONLY" -eq 1 ] \
&& { [ "$MODE_EXPLICIT" -eq 1 ] || [ "$SHOW_ONLY" -eq 1 ] || [ "$REDETECT" -eq 1 ]; }; then
error "--restart 不能与 --mode / --show / --redetect 同时使用"
exit 1
fi
# ===== 检查 root =====
# .env 权限为 600,读取它同样需要 root
if [ "$(id -u)" -ne 0 ]; then
@@ -246,6 +275,56 @@ configure_restart_timer() {
warn "重启会切断所有活动连接;崩溃恢复本已由 Restart=always 覆盖,按需启用"
}
# ===== --restart:只改重启计划 =====
# 明确不做:装依赖、升级 Xray、生成密钥、选伪装目标、重写 config.json、
# 改防火墙与 sysctl、重启 xray。因此 vless 链接与现有连接均不受影响。
apply_restart_only() {
local env_file="$SCRIPT_DIR/.env"
if [ ! -f "$env_file" ]; then
error "未找到 ${env_file},无法确认这是一台已部署的机器"
error "请先执行完整部署: bash deploy.sh"
exit 1
fi
if ! systemctl cat xray >/dev/null 2>&1; then
error "未找到 xray.service,请先执行完整部署: bash deploy.sh"
exit 1
fi
# 命令行给了值就覆盖 .env 载入的值,没给则沿用
if [ -n "$RESTART_ARG_DAYS" ]; then
XRAY_RESTART_EVERY_DAYS="$RESTART_ARG_DAYS"
fi
if [ -n "$RESTART_ARG_TIME" ]; then
XRAY_RESTART_TIME="$RESTART_ARG_TIME"
fi
resolve_restart_config || exit 1
# 只把命令行显式给过的字段落盘,没给的不动 .env
if [ -n "$RESTART_ARG_DAYS" ]; then
update_env_field "$env_file" XRAY_RESTART_EVERY_DAYS "$RESTART_EVERY_DAYS"
fi
if [ -n "$RESTART_ARG_TIME" ]; then
update_env_field "$env_file" XRAY_RESTART_TIME "$RESTART_TIME"
fi
configure_restart_timer
echo ""
echo "=========================================================="
if [ "$RESTART_EVERY_DAYS" -eq 0 ]; then
echo " 定时重启: 已关闭"
else
echo " 定时重启: 每 ${RESTART_EVERY_DAYS}${RESTART_TIME} (${RESTART_TZ})"
fi
echo " xray 服务未重启,vless 链接与现有连接均未受影响。"
echo "=========================================================="
if [ "$RESTART_EVERY_DAYS" -ne 0 ]; then
echo ""
systemctl list-timers xray-restart.timer --no-pager 2>/dev/null || true
fi
}
resolve_restart_config || exit 1
XRAY_PORT="${XRAY_PORT:-443}"
@@ -1033,6 +1112,11 @@ main() {
exit 0
fi
if [ "$RESTART_ONLY" -eq 1 ]; then
apply_restart_only
exit 0
fi
echo ""
log "部署模式: ${MODE}"
[ "$MODE" = "reality" ] && log "VLESS-Reality(推荐,抗封锁)" || log "VLESS TCP(极速,无 TLS"