mirror of
https://github.com/wnlen/clash-for-linux.git
synced 2026-02-04 10:11:28 +08:00
scripts\install_systemd.sh shutdown.sh start.sh
This commit is contained in:
@ -51,20 +51,17 @@ chown -R "$Service_User:$Service_Group" \
|
||||
cat >"$Unit_Path"<<EOF
|
||||
[Unit]
|
||||
Description=Clash for Linux
|
||||
After=network.target
|
||||
Wants=network.target
|
||||
After=network-online.target
|
||||
Wants=network-online.target
|
||||
|
||||
[Service]
|
||||
Type=forking
|
||||
Type=simple
|
||||
WorkingDirectory=$Server_Dir
|
||||
|
||||
# 启动 / 停止
|
||||
ExecStart=/bin/bash $Server_Dir/start.sh
|
||||
ExecStop=/bin/bash $Server_Dir/shutdown.sh
|
||||
|
||||
# PID 管理
|
||||
PIDFile=$PID_FILE
|
||||
|
||||
# 失败策略
|
||||
Restart=on-failure
|
||||
RestartSec=5
|
||||
|
||||
@ -7,12 +7,14 @@ Temp_Dir="$Server_Dir/temp"
|
||||
Conf_Dir="$Server_Dir/conf"
|
||||
PID_FILE="$Temp_Dir/clash.pid"
|
||||
|
||||
mkdir -p "$Temp_Dir"
|
||||
|
||||
# 1) 优先按 PID_FILE 停
|
||||
if [ -f "$PID_FILE" ]; then
|
||||
PID="$(cat "$PID_FILE" 2>/dev/null || true)"
|
||||
if [ -n "${PID:-}" ] && kill -0 "$PID" 2>/dev/null; then
|
||||
kill "$PID" 2>/dev/null || true
|
||||
for _ in {1..5}; do
|
||||
for _ in {1..8}; do
|
||||
sleep 1
|
||||
if ! kill -0 "$PID" 2>/dev/null; then
|
||||
break
|
||||
@ -29,7 +31,7 @@ else
|
||||
PIDS="$(pgrep -f " -d ${Conf_Dir}(\s|$)" || true)"
|
||||
if [ -n "${PIDS:-}" ]; then
|
||||
kill $PIDS 2>/dev/null || true
|
||||
for _ in {1..5}; do
|
||||
for _ in {1..8}; do
|
||||
sleep 1
|
||||
if ! pgrep -f " -d ${Conf_Dir}(\s|$)" >/dev/null 2>&1; then
|
||||
break
|
||||
|
||||
34
start.sh
34
start.sh
@ -18,7 +18,7 @@ Server_Dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
|
||||
# 加载.env变量文件
|
||||
# shellcheck disable=SC1090
|
||||
source "$Server_Dir/.env"
|
||||
[ -f "$Server_Dir/.env" ] && source "$Server_Dir/.env"
|
||||
|
||||
# systemd 模式开关(必须在 set -u 下安全)
|
||||
SYSTEMD_MODE="${SYSTEMD_MODE:-false}"
|
||||
@ -40,17 +40,28 @@ mkdir -p "$Conf_Dir" "$Temp_Dir" "$Log_Dir"
|
||||
|
||||
PID_FILE="${CLASH_PID_FILE:-$Temp_Dir/clash.pid}"
|
||||
|
||||
is_running() {
|
||||
if [ -f "$PID_FILE" ]; then
|
||||
local pid
|
||||
pid="$(cat "$PID_FILE" 2>/dev/null || true)"
|
||||
if [ -n "${pid:-}" ] && kill -0 "$pid" 2>/dev/null; then
|
||||
return 0
|
||||
fi
|
||||
fi
|
||||
return 1
|
||||
}
|
||||
|
||||
if is_running; then
|
||||
echo -e "\n[OK] Clash 已在运行 (pid=$(cat "$PID_FILE")),跳过重复启动\n"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# 将 CLASH_URL 变量的值赋给 URL 变量,并检查 CLASH_URL 是否为空
|
||||
# systemd 模式:允许为空(用兜底配置启动)
|
||||
if [ "${SYSTEMD_MODE}" = "true" ]; then
|
||||
URL="${CLASH_URL:-}"
|
||||
else
|
||||
SYSTEMD_MODE="${SYSTEMD_MODE:-false}"
|
||||
if [ "$SYSTEMD_MODE" = "true" ]; then
|
||||
URL="${CLASH_URL:-}"
|
||||
else
|
||||
URL=${CLASH_URL:?Error: CLASH_URL variable is not set or empty}
|
||||
fi
|
||||
URL="${CLASH_URL:?Error: CLASH_URL variable is not set or empty}"
|
||||
fi
|
||||
|
||||
# 获取 CLASH_SECRET 值:优先 .env;其次读取旧 config;占位符视为无效;最后生成随机值
|
||||
@ -397,13 +408,20 @@ Clash_Bin="$(resolve_clash_bin "$Server_Dir" "$CpuArch")"
|
||||
ReturnStatus=$?
|
||||
|
||||
if [ "$ReturnStatus" -eq 0 ]; then
|
||||
nohup "$Clash_Bin" -d "$Conf_Dir" &> "$Log_Dir/clash.log" &
|
||||
if [ "${SYSTEMD_MODE:-false}" = "true" ]; then
|
||||
echo "[INFO] SYSTEMD_MODE=true,前台启动交给 systemd 监管"
|
||||
# systemd 前台:让 systemd 直接跟踪 clash 进程
|
||||
exec "$Clash_Bin" -d "$Conf_Dir"
|
||||
else
|
||||
echo "[INFO] 后台启动 (nohup)"
|
||||
nohup "$Clash_Bin" -d "$Conf_Dir" >>"$Log_Dir/clash.log" 2>&1 &
|
||||
PID=$!
|
||||
ReturnStatus=$?
|
||||
if [ "$ReturnStatus" -eq 0 ]; then
|
||||
echo "$PID" > "$PID_FILE"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
if_success "$Text5" "$Text6" "$ReturnStatus"
|
||||
|
||||
|
||||
Reference in New Issue
Block a user