first commit
This commit is contained in:
182
openlist/install_openlist.sh
Normal file
182
openlist/install_openlist.sh
Normal file
@@ -0,0 +1,182 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
# openlist 一键安装脚本
|
||||
# 用法示例:curl -fsSL "https://pan.shumengya.top/d/scripts/openlist/install_openlist.sh" | bash
|
||||
|
||||
BASE_URL="https://pan.shumengya.top/d/scripts/openlist/openlist"
|
||||
INSTALL_DIR="/shumengya/bin/openlist"
|
||||
SERVICE_NAME="smy-openlist"
|
||||
SERVICE_FILE="/etc/systemd/system/${SERVICE_NAME}.service"
|
||||
|
||||
log() { printf '[openlist-安装] %s\n' "$*" >&2; }
|
||||
fail() { log "错误: $*" >&2; exit 1; }
|
||||
|
||||
# 进度条函数
|
||||
show_progress() {
|
||||
local pid=$1
|
||||
local text=$2
|
||||
local delay=0.1
|
||||
local spin='-\|/'
|
||||
|
||||
printf "[openlist-安装] %s... " "$text" >&2
|
||||
|
||||
while ps -p "$pid" > /dev/null 2>&1; do
|
||||
local temp=${spin#?}
|
||||
printf "\b%c" "$spin" >&2
|
||||
local spin=$temp${spin%"$temp"}
|
||||
sleep $delay
|
||||
done
|
||||
printf "\b完成\n" >&2
|
||||
}
|
||||
|
||||
check_port() {
|
||||
# 检查端口占用并尝试清理
|
||||
local port=5244
|
||||
if lsof -i :$port >/dev/null 2>&1 || netstat -tunlp | grep -q ":$port "; then
|
||||
log "检测到端口 $port 被占用,尝试清理..."
|
||||
fuser -k -n tcp $port >/dev/null 2>&1 || true
|
||||
sleep 1
|
||||
if lsof -i :$port >/dev/null 2>&1; then
|
||||
# 尝试查找占用进程并强制杀掉
|
||||
local pid
|
||||
pid=$(lsof -t -i:$port 2>/dev/null || true)
|
||||
if [ -n "$pid" ]; then
|
||||
kill -9 "$pid" 2>/dev/null || true
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
require_root() {
|
||||
# 必须使用 root 权限执行
|
||||
if [ "${EUID:-$(id -u)}" -ne 0 ]; then
|
||||
fail "请使用 root 权限运行 (sudo bash install_openlist.sh)"
|
||||
fi
|
||||
}
|
||||
|
||||
detect_arch() {
|
||||
# 自动检测 CPU 架构,选择对应二进制
|
||||
local machine
|
||||
machine=$(uname -m)
|
||||
case "$machine" in
|
||||
x86_64|amd64) echo "amd64" ;;
|
||||
aarch64|arm64) echo "arm64" ;;
|
||||
*) fail "不支持的架构: $machine" ;;
|
||||
esac
|
||||
}
|
||||
|
||||
download_files() {
|
||||
# 下载对应架构的二进制包和 data 目录
|
||||
local arch tmp_dir binary_url data_url
|
||||
arch="$1"
|
||||
tmp_dir=$(mktemp -d)
|
||||
# 只在 tmp_dir 存在时清理
|
||||
trap 'if [ -n "${tmp_dir:-}" ] && [ -d "$tmp_dir" ]; then rm -rf "$tmp_dir"; fi' EXIT
|
||||
|
||||
binary_url="${BASE_URL}/linux-${arch}.tar.gz"
|
||||
data_url="${BASE_URL}/data.tgz"
|
||||
|
||||
# 后台下载并显示进度
|
||||
curl -fsSL "$binary_url" -o "$tmp_dir/openlist.tar.gz" &
|
||||
show_progress $! "正在下载 ${arch} 架构的二进制文件"
|
||||
[ -f "$tmp_dir/openlist.tar.gz" ] || fail "下载二进制文件失败"
|
||||
|
||||
# 检查 data 目录是否已存在,如果存在则跳过下载
|
||||
if [ -d "$INSTALL_DIR/data" ]; then
|
||||
log "检测到已存在 data 目录,跳过下载以保护现有数据"
|
||||
else
|
||||
curl -fsSL "$data_url" -o "$tmp_dir/data.tgz" &
|
||||
show_progress $! "正在下载 data 配置文件"
|
||||
[ -f "$tmp_dir/data.tgz" ] || fail "下载 data 文件失败"
|
||||
fi
|
||||
|
||||
echo "$tmp_dir"
|
||||
}
|
||||
|
||||
install_binary_and_data() {
|
||||
# 解压并安装二进制文件和 data 目录
|
||||
local tmp_dir extracted_dir bin_path
|
||||
tmp_dir="$1"
|
||||
|
||||
log "正在安装 openlist 到 $INSTALL_DIR..."
|
||||
|
||||
# 尝试停止服务
|
||||
systemctl stop "$SERVICE_NAME" 2>/dev/null || true
|
||||
# 检查并清理端口
|
||||
check_port
|
||||
|
||||
mkdir -p "$INSTALL_DIR"
|
||||
|
||||
# 只在下载了 data.tgz 时才解压
|
||||
if [ -f "$tmp_dir/data.tgz" ]; then
|
||||
tar -xzf "$tmp_dir/data.tgz" -C "$INSTALL_DIR/" || fail "解压 data 目录失败"
|
||||
else
|
||||
log "保留现有 data 目录,不进行覆盖"
|
||||
fi
|
||||
|
||||
# 解压二进制文件
|
||||
extracted_dir=$(mktemp -d)
|
||||
trap 'if [ -n "${tmp_dir:-}" ] && [ -d "$tmp_dir" ]; then rm -rf "$tmp_dir"; fi; if [ -n "${extracted_dir:-}" ] && [ -d "$extracted_dir" ]; then rm -rf "$extracted_dir"; fi' EXIT
|
||||
tar -xzf "$tmp_dir/openlist.tar.gz" -C "$extracted_dir" || fail "解压二进制文件失败"
|
||||
bin_path=$(find "$extracted_dir" -maxdepth 2 -type f -name "openlist" -perm -111 | head -n 1)
|
||||
[ -n "$bin_path" ] || fail "未找到 openlist 可执行文件"
|
||||
cp "$bin_path" "$INSTALL_DIR/openlist" || fail "复制可执行文件失败"
|
||||
chmod +x "$INSTALL_DIR/openlist"
|
||||
log "文件安装完成"
|
||||
}
|
||||
|
||||
write_service() {
|
||||
# 写入 systemd 服务文件,默认自启动并在失败时重启
|
||||
log "正在配置 systemd 服务..."
|
||||
cat > "$SERVICE_FILE" <<'EOF'
|
||||
[Unit]
|
||||
Description=openlist
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
User=root
|
||||
Group=root
|
||||
WorkingDirectory=/shumengya/bin/openlist
|
||||
ExecStart=/shumengya/bin/openlist/openlist server
|
||||
Restart=on-failure
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOF
|
||||
}
|
||||
|
||||
enable_service() {
|
||||
# 重新加载 systemd,设置开机自启并立即启动
|
||||
log "正在启用并启动服务..."
|
||||
systemctl daemon-reload
|
||||
systemctl enable "$SERVICE_NAME"
|
||||
systemctl restart "$SERVICE_NAME"
|
||||
|
||||
# 等待几秒钟以捕获立即崩溃的情况
|
||||
sleep 3
|
||||
}
|
||||
|
||||
main() {
|
||||
require_root
|
||||
local arch tmp_dir=""
|
||||
arch=$(detect_arch)
|
||||
log "检测到系统架构: $arch"
|
||||
tmp_dir=$(download_files "$arch")
|
||||
install_binary_and_data "$tmp_dir"
|
||||
write_service
|
||||
enable_service
|
||||
log "=========================================="
|
||||
log "安装完成! openlist 已安装到: $INSTALL_DIR"
|
||||
log "服务已启动,查看状态: systemctl status $SERVICE_NAME"
|
||||
|
||||
# 检查服务状态
|
||||
if ! systemctl is-active --quiet "$SERVICE_NAME"; then
|
||||
log "警告: 服务未能正常启动"
|
||||
journalctl -u "$SERVICE_NAME" --no-pager -n 20
|
||||
fi
|
||||
log "=========================================="
|
||||
}
|
||||
|
||||
main "$@"
|
||||
BIN
openlist/openlist/data.tgz
Normal file
BIN
openlist/openlist/data.tgz
Normal file
Binary file not shown.
145
openlist/openlist/data/config.json
Normal file
145
openlist/openlist/data/config.json
Normal file
@@ -0,0 +1,145 @@
|
||||
{
|
||||
"force": false,
|
||||
"site_url": "",
|
||||
"cdn": "",
|
||||
"jwt_secret": "J4l3vzgvqQPWy1yH",
|
||||
"token_expires_in": 48,
|
||||
"database": {
|
||||
"type": "sqlite3",
|
||||
"host": "",
|
||||
"port": 0,
|
||||
"user": "",
|
||||
"password": "",
|
||||
"name": "",
|
||||
"db_file": "data/data.db",
|
||||
"table_prefix": "x_",
|
||||
"ssl_mode": "",
|
||||
"dsn": ""
|
||||
},
|
||||
"meilisearch": {
|
||||
"host": "http://localhost:7700",
|
||||
"api_key": "",
|
||||
"index": "openlist"
|
||||
},
|
||||
"scheme": {
|
||||
"address": "0.0.0.0",
|
||||
"http_port": 5244,
|
||||
"https_port": -1,
|
||||
"force_https": false,
|
||||
"cert_file": "",
|
||||
"key_file": "",
|
||||
"unix_file": "",
|
||||
"unix_file_perm": "",
|
||||
"enable_h2c": false,
|
||||
"enable_h3": false
|
||||
},
|
||||
"temp_dir": "data/temp",
|
||||
"bleve_dir": "data/bleve",
|
||||
"dist_dir": "",
|
||||
"log": {
|
||||
"enable": true,
|
||||
"name": "data/log/log.log",
|
||||
"max_size": 50,
|
||||
"max_backups": 30,
|
||||
"max_age": 28,
|
||||
"compress": false,
|
||||
"filter": {
|
||||
"enable": false,
|
||||
"filters": [
|
||||
{
|
||||
"cidr": "",
|
||||
"path": "/ping",
|
||||
"method": ""
|
||||
},
|
||||
{
|
||||
"cidr": "",
|
||||
"path": "",
|
||||
"method": "HEAD"
|
||||
},
|
||||
{
|
||||
"cidr": "",
|
||||
"path": "/dav/",
|
||||
"method": "PROPFIND"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"delayed_start": 0,
|
||||
"max_buffer_limitMB": -1,
|
||||
"mmap_thresholdMB": 4,
|
||||
"max_connections": 0,
|
||||
"max_concurrency": 64,
|
||||
"tls_insecure_skip_verify": true,
|
||||
"tasks": {
|
||||
"download": {
|
||||
"workers": 5,
|
||||
"max_retry": 1,
|
||||
"task_persistant": false
|
||||
},
|
||||
"transfer": {
|
||||
"workers": 5,
|
||||
"max_retry": 2,
|
||||
"task_persistant": false
|
||||
},
|
||||
"upload": {
|
||||
"workers": 5,
|
||||
"max_retry": 0,
|
||||
"task_persistant": false
|
||||
},
|
||||
"copy": {
|
||||
"workers": 5,
|
||||
"max_retry": 2,
|
||||
"task_persistant": false
|
||||
},
|
||||
"move": {
|
||||
"workers": 5,
|
||||
"max_retry": 2,
|
||||
"task_persistant": false
|
||||
},
|
||||
"decompress": {
|
||||
"workers": 5,
|
||||
"max_retry": 2,
|
||||
"task_persistant": false
|
||||
},
|
||||
"decompress_upload": {
|
||||
"workers": 5,
|
||||
"max_retry": 2,
|
||||
"task_persistant": false
|
||||
},
|
||||
"allow_retry_canceled": false
|
||||
},
|
||||
"cors": {
|
||||
"allow_origins": [
|
||||
"*"
|
||||
],
|
||||
"allow_methods": [
|
||||
"*"
|
||||
],
|
||||
"allow_headers": [
|
||||
"*"
|
||||
]
|
||||
},
|
||||
"s3": {
|
||||
"enable": false,
|
||||
"port": 5246,
|
||||
"ssl": false
|
||||
},
|
||||
"ftp": {
|
||||
"enable": false,
|
||||
"listen": ":5221",
|
||||
"find_pasv_port_attempts": 50,
|
||||
"active_transfer_port_non_20": false,
|
||||
"idle_timeout": 900,
|
||||
"connection_timeout": 30,
|
||||
"disable_active_mode": false,
|
||||
"default_transfer_binary": false,
|
||||
"enable_active_conn_ip_check": true,
|
||||
"enable_pasv_conn_ip_check": true
|
||||
},
|
||||
"sftp": {
|
||||
"enable": false,
|
||||
"listen": ":5222"
|
||||
},
|
||||
"last_launched_version": "refs/heads/main",
|
||||
"proxy_address": ""
|
||||
}
|
||||
BIN
openlist/openlist/data/data.db-shm
Normal file
BIN
openlist/openlist/data/data.db-shm
Normal file
Binary file not shown.
BIN
openlist/openlist/data/data.db-wal
Normal file
BIN
openlist/openlist/data/data.db-wal
Normal file
Binary file not shown.
BIN
openlist/openlist/linux-amd64.tar.gz
Normal file
BIN
openlist/openlist/linux-amd64.tar.gz
Normal file
Binary file not shown.
BIN
openlist/openlist/linux-arm64.tar.gz
Normal file
BIN
openlist/openlist/linux-arm64.tar.gz
Normal file
Binary file not shown.
12
openlist/openlist/smy-openlist.service
Normal file
12
openlist/openlist/smy-openlist.service
Normal file
@@ -0,0 +1,12 @@
|
||||
[Unit]
|
||||
Description=openlist
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
WorkingDirectory=/shumengya/bin/openlist
|
||||
ExecStart=/shumengya/bin/openlist/openlist server
|
||||
Restart=on-failure
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
46
openlist/start_openlist.sh
Normal file
46
openlist/start_openlist.sh
Normal file
@@ -0,0 +1,46 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
# 恢复并启动 openlist 服务
|
||||
# 该脚本用于在执行 stopkill 后恢复服务的正常运行和开机自启
|
||||
# 用法:curl -fsSL "https://pan.shumengya.top/d/scripts/openlist/start_openlist.sh" | sudo bash
|
||||
|
||||
SERVICE_NAME="smy-openlist"
|
||||
|
||||
log() { printf '[openlist-启动] %s\n' "$*" >&2; }
|
||||
fail() { log "错误: $*" >&2; exit 1; }
|
||||
|
||||
# 检查 root 权限
|
||||
if [ "${EUID:-$(id -u)}" -ne 0 ]; then
|
||||
fail "请使用 root 权限运行"
|
||||
fi
|
||||
|
||||
log "正在检查服务状态..."
|
||||
|
||||
# 检查服务文件是否存在
|
||||
if [ ! -f "/etc/systemd/system/${SERVICE_NAME}.service" ]; then
|
||||
fail "未找到服务文件 /etc/systemd/system/${SERVICE_NAME}.service,请先运行安装脚本。"
|
||||
fi
|
||||
|
||||
log "正在恢复服务设置..."
|
||||
# 重置可能的失败状态
|
||||
systemctl reset-failed "$SERVICE_NAME" 2>/dev/null || true
|
||||
|
||||
log "正在启用并启动服务..."
|
||||
# --now 选项会同时启用(enable)并启动(start)服务
|
||||
systemctl enable --now "$SERVICE_NAME"
|
||||
|
||||
# 等待服务启动
|
||||
sleep 2
|
||||
|
||||
# 检查启动状态
|
||||
if systemctl is-active --quiet "$SERVICE_NAME"; then
|
||||
log "服务启动成功!"
|
||||
log "状态: $(systemctl is-active "$SERVICE_NAME")"
|
||||
log "您可以访问 http://IP:5244 使用服务"
|
||||
else
|
||||
log "警告: 服务启动似乎遇到了问题"
|
||||
log "以下是最后 10 行日志:"
|
||||
systemctl status "$SERVICE_NAME" --no-pager -n 10 || true
|
||||
exit 1
|
||||
fi
|
||||
70
openlist/stopkill_openlist.sh
Normal file
70
openlist/stopkill_openlist.sh
Normal file
@@ -0,0 +1,70 @@
|
||||
#!/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 会将服务状态置为 inactive,systemd 不会自动重启它,除非手动 start/restart
|
||||
# 即使服务被 disable,systemctl 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
|
||||
104
openlist/uninstall_openlist.sh
Normal file
104
openlist/uninstall_openlist.sh
Normal file
@@ -0,0 +1,104 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
# openlist 一键卸载脚本
|
||||
# 用法:sudo bash uninstall_openlist.sh
|
||||
|
||||
INSTALL_DIR="/shumengya/bin/openlist"
|
||||
SERVICE_NAME="smy-openlist"
|
||||
SERVICE_FILE="/etc/systemd/system/${SERVICE_NAME}.service"
|
||||
|
||||
log() { printf '[openlist-卸载] %s\n' "$*" >&2; }
|
||||
fail() { log "错误: $*" >&2; exit 1; }
|
||||
|
||||
# 进度条函数
|
||||
show_progress() {
|
||||
local pid=$1
|
||||
local text=$2
|
||||
local delay=0.1
|
||||
local spin='-\|/'
|
||||
|
||||
printf "[openlist-卸载] %s... " "$text" >&2
|
||||
|
||||
while ps -p "$pid" > /dev/null 2>&1; do
|
||||
local temp=${spin#?}
|
||||
printf "\b%c" "$spin" >&2
|
||||
local spin=$temp${spin%"$temp"}
|
||||
sleep $delay
|
||||
done
|
||||
printf "\b完成\n" >&2
|
||||
}
|
||||
|
||||
require_root() {
|
||||
# 必须使用 root 权限执行
|
||||
if [ "${EUID:-$(id -u)}" -ne 0 ]; then
|
||||
fail "请使用 root 权限运行 (sudo bash uninstall_openlist.sh)"
|
||||
fi
|
||||
}
|
||||
|
||||
stop_and_disable_service() {
|
||||
# 停止并禁用 systemd 服务
|
||||
if systemctl is-active --quiet "$SERVICE_NAME"; then
|
||||
log "正在停止服务 $SERVICE_NAME..."
|
||||
systemctl stop "$SERVICE_NAME"
|
||||
fi
|
||||
|
||||
if systemctl is-enabled --quiet "$SERVICE_NAME" 2>/dev/null; then
|
||||
log "正在禁用服务 $SERVICE_NAME..."
|
||||
systemctl disable "$SERVICE_NAME"
|
||||
fi
|
||||
}
|
||||
|
||||
remove_service_file() {
|
||||
# 删除 systemd 服务文件
|
||||
if [ -f "$SERVICE_FILE" ]; then
|
||||
log "正在删除服务文件..."
|
||||
rm -f "$SERVICE_FILE"
|
||||
systemctl daemon-reload
|
||||
fi
|
||||
}
|
||||
|
||||
remove_install_dir() {
|
||||
# 删除安装目录
|
||||
if [ -d "$INSTALL_DIR" ]; then
|
||||
log "正在删除安装目录 $INSTALL_DIR..."
|
||||
rm -rf "$INSTALL_DIR"
|
||||
fi
|
||||
}
|
||||
|
||||
check_and_kill_port() {
|
||||
local port=5244
|
||||
if lsof -i :$port >/dev/null 2>&1 || netstat -tunlp | grep -q ":$port "; then
|
||||
log "检测到端口 $port 仍被占用,尝试强制清理..."
|
||||
fuser -k -n tcp $port >/dev/null 2>&1 || true
|
||||
sleep 1
|
||||
# 二次检查
|
||||
local pid
|
||||
pid=$(lsof -t -i:$port 2>/dev/null || true)
|
||||
if [ -n "$pid" ]; then
|
||||
kill -9 "$pid" 2>/dev/null || true
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
main() {
|
||||
require_root
|
||||
|
||||
log "开始卸载 openlist..."
|
||||
(stop_and_disable_service) &
|
||||
show_progress $! "正在停止服务"
|
||||
|
||||
(remove_service_file) &
|
||||
show_progress $! "正在删除服务文件"
|
||||
|
||||
check_and_kill_port
|
||||
|
||||
(remove_install_dir) &
|
||||
show_progress $! "正在删除安装目录"
|
||||
|
||||
log "=========================================="
|
||||
log "卸载完成! openlist 已从系统中移除"
|
||||
log "=========================================="
|
||||
}
|
||||
|
||||
main "$@"
|
||||
Reference in New Issue
Block a user