Files
linux-bash/openlist/stopkill_openlist.sh
2026-02-17 17:28:37 +08:00

71 lines
2.3 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env bash
set -euo pipefail
# 强制停止 openlist 服务并清理进程
# 用法curl -fsSL "https://pan.shumengya.top/d/scripts/openlist/stopkill_openlist.sh" | sudo bash
SERVICE_NAME="smy-openlist"
BIN_NAME="openlist"
PORT=5244
log() { printf '[openlist-停止] %s\n' "$*" >&2; }
if [ "${EUID:-$(id -u)}" -ne 0 ]; then
log "请使用 root 权限运行"
exit 1
fi
log "正在停止 systemd 服务..."
# systemctl stop 会将服务状态置为 inactivesystemd 不会自动重启它,除非手动 start/restart
# 即使服务被 disablesystemctl restart 仍然可以启动它
systemctl disable --now "$SERVICE_NAME" 2>/dev/null || true
systemctl stop "$SERVICE_NAME" 2>/dev/null || true
log "正在检查残留进程..."
# 排除当前脚本自身的 PID防止误杀
current_pid=$$
# 按进程名强制杀 (使用 -x 精确匹配进程名,避免匹配到脚本自身)
pids=$(pgrep -x "$BIN_NAME" || true)
# 如果 -x 没找到,尝试 -f 但过滤掉脚本自身
if [ -z "$pids" ]; then
pids=$(pgrep -f "$BIN_NAME" | grep -v "$current_pid" || true)
fi
if [ -n "$pids" ]; then
log "发现残留进程 PID: $pids,正在强制终止..."
kill -9 $pids 2>/dev/null || true
fi
# 按端口强制杀
pid_port=""
if command -v lsof >/dev/null 2>&1; then
pid_port=$(lsof -t -i:$PORT 2>/dev/null || true)
elif command -v ss >/dev/null 2>&1; then
# ss 输出格式处理,提取 pid
pid_port=$(ss -lptn "sport = :$PORT" | grep -oE 'pid=[0-9]+' | cut -d= -f2 | sort -u || true)
elif command -v netstat >/dev/null 2>&1; then
pid_port=$(netstat -nlp | grep ":$PORT " | awk '{print $7}' | cut -d/ -f1 || true)
fi
if [ -n "$pid_port" ]; then
# 再次过滤掉当前 PID (虽然不太可能占用端口,但为了安全)
pid_port=$(echo "$pid_port" | grep -v "^$current_pid$")
if [ -n "$pid_port" ]; then
log "发现端口 $PORT 占用进程 PID: $pid_port,正在强制终止..."
kill -9 $pid_port 2>/dev/null || true
fi
fi
# 重置服务失败状态,避免 systemd 认为服务处于错误状态
systemctl reset-failed "$SERVICE_NAME" 2>/dev/null || true
# 最终状态检查
log "正在验证服务状态..."
if pgrep -x "$BIN_NAME" >/dev/null; then
log "警告: 进程仍在运行!"
ps -fp $(pgrep -x "$BIN_NAME")
else
log "openlist 已完全停止 (服务已禁用,进程已清理)。"
fi