forked from LopSdir/clash-for-linux
-
Notifications
You must be signed in to change notification settings - Fork 18
/
shutdown.sh
executable file
·115 lines (96 loc) · 2.58 KB
/
shutdown.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
#!/bin/bash
# 获取脚本工作目录绝对路径
export Server_Dir=$(cd $(dirname "${BASH_SOURCE[0]}") && pwd)
# 关闭监视模式,不再报告后台作业状态
set +m
# 自定义函数
# 显示成功消息
success() {
echo -en "\033[60G[\033[1;32m OK \033[0;39m]\r"
return 0
}
# 显示失败消息
failure() {
local rc=$?
echo -en "\033[60G[\033[1;31mFAILED\033[0;39m]\r"
[ -x /bin/plymouth ] && /bin/plymouth --details
return $rc
}
# 执行操作并显示结果
action() {
local STRING=$1
echo -n "$STRING "
shift
"$@" && success "$STRING" || failure "$STRING"
local rc=$?
echo
return $rc
}
# 判断命令是否正常执行
if_success() {
local ReturnStatus=${3:-0} # 如果 \$3 未设置或为空,则默认为 0
if [ "$ReturnStatus" -eq 0 ]; then
action "$1" /bin/true
else
action "$2" /bin/false
exit 1
fi
}
# 安全删除文件
safe_remove() {
local file="$1"
if [ -f "$file" ]; then
rm "$file"
echo "已删除文件: $file"
else
echo "文件不存在,跳过删除: $file"
fi
}
# 主要操作
# 关闭clash服务
Text1="clash进程关闭成功!"
Text2="clash进程关闭失败!"
PID_NUM=$(ps -ef | grep [c]lash-linux | wc -l)
PID=$(ps -ef | grep [c]lash-linux | sed -n 's/^[^ ]* *\([^ ]*\).*/\1/p')
ReturnStatus=0
if [ "$PID_NUM" -ne 0 ]; then
kill "$PID" &>/dev/null
ReturnStatus=$?
fi
if_success "$Text1" "$Text2" "$ReturnStatus"
# 定义路径变量
Conf_Dir="$Server_Dir/conf"
Log_Dir="$Server_Dir/logs"
# 删除配置文件和日志
safe_remove "$Conf_Dir/config.yaml"
safe_remove "$Conf_Dir/cache.db"
rm -rf "$Log_Dir"
# 清除环境变量
unset http_proxy https_proxy no_proxy HTTP_PROXY HTTPS_PROXY NO_PROXY
# 从 .bashrc 中删除函数和相关行
functions_to_remove=("proxy_on" "proxy_off" "shutdown_system")
for func in "${functions_to_remove[@]}"; do
sed -i -E "/^function[[:space:]]+${func}[[:space:]]*()/,/^}$/d" ~/.bashrc
done
sed -i '/^# 开启系统代理/d; /^# 关闭系统代理/d; /^# 新增关闭系统函数/d; /^# 检查clash进程是否正常启动/d; /proxy_on/d; /^#.*proxy_on/d' ~/.bashrc
sed -i '/^$/N;/^\n$/D' ~/.bashrc
# 重新加载.bashrc文件
source ~/.bashrc
echo -e "\033[32m \n[√]服务关闭成功\n \033[0m"
# 询问用户是否删除工作目录
read -p "是否删除工作目录 ${Server_Dir}? [y/n]: " answer
case $answer in
[Yy]* )
echo "正在删除工作目录 ${Server_Dir}..."
rm -rf "$Server_Dir"
echo "工作目录已删除。"
;;
[Nn]* )
echo "未删除工作目录。"
;;
* )
echo "请输入 'y' 或 'n'。"
;;
esac
# 恢复监视模式
set -m