claw-subagent-service 0.0.38 → 0.0.39
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +411 -60
- package/cli.js +16 -1
- package/command/linux/restart.sh +138 -21
- package/command/linux/start.sh +117 -24
- package/command/linux/status.sh +172 -43
- package/command/linux/stop.sh +143 -36
- package/package.json +1 -1
- package/scripts/post-install.js +15 -0
- package/service/daemon/clawsubagentservice.exe +0 -0
- package/service/daemon/clawsubagentservice.exe.config +6 -0
- package/service/daemon/clawsubagentservice.xml +33 -0
- package/service/modules/opencode-service.js +139 -66
- package/service/worker.js +18 -6
package/command/linux/restart.sh
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
# OpenClaw 服务重启脚本
|
|
4
4
|
# 用法: ./restart.sh [选项]
|
|
5
|
+
# 支持 systemd 和 Docker(无 systemd)双模式
|
|
5
6
|
|
|
6
7
|
set -e
|
|
7
8
|
|
|
@@ -17,14 +18,46 @@ log_error() { echo -e "${RED}[ERROR]${NC} $1"; }
|
|
|
17
18
|
|
|
18
19
|
SERVICE_NAME="openclaw-gateway.service"
|
|
19
20
|
MAX_WAIT=300 # 最长等待5分钟
|
|
21
|
+
PORT="18789"
|
|
20
22
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
23
|
+
# 检测是否在 Docker 环境(无 systemd)
|
|
24
|
+
is_docker() {
|
|
25
|
+
if ! command -v systemctl &>/dev/null; then
|
|
26
|
+
return 0 # 无 systemctl,认为是 Docker
|
|
27
|
+
fi
|
|
28
|
+
return 1
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
# 获取 openclaw 进程 PID
|
|
32
|
+
get_openclaw_pid() {
|
|
33
|
+
# 只通过端口查找进程(最可靠,避免僵尸进程和误匹配)
|
|
34
|
+
if command -v netstat &>/dev/null; then
|
|
35
|
+
local pid
|
|
36
|
+
pid=$(netstat -tnlp 2>/dev/null | grep ":18789 " | head -1 | awk '{print $7}' | cut -d'/' -f1)
|
|
37
|
+
if [ -n "$pid" ]; then
|
|
38
|
+
echo "$pid"
|
|
39
|
+
return
|
|
40
|
+
fi
|
|
25
41
|
fi
|
|
42
|
+
|
|
43
|
+
# 没有监听端口,返回空(不再使用 pgrep 避免误匹配)
|
|
44
|
+
echo ""
|
|
26
45
|
}
|
|
27
46
|
|
|
47
|
+
# 检查端口是否监听
|
|
48
|
+
check_port() {
|
|
49
|
+
local port=$1
|
|
50
|
+
if command -v ss &>/dev/null; then
|
|
51
|
+
ss -tln | grep -q ":$port "
|
|
52
|
+
elif command -v netstat &>/dev/null; then
|
|
53
|
+
netstat -tln | grep -q ":$port "
|
|
54
|
+
else
|
|
55
|
+
# 降级:直接检查进程
|
|
56
|
+
[ -n "$(get_openclaw_pid)" ]
|
|
57
|
+
fi
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
# 等待端口启动
|
|
28
61
|
wait_for_port() {
|
|
29
62
|
local port=$1
|
|
30
63
|
local max_wait=$2
|
|
@@ -33,7 +66,7 @@ wait_for_port() {
|
|
|
33
66
|
log_info "等待端口 $port 启动(最长等待 ${max_wait} 秒)..."
|
|
34
67
|
|
|
35
68
|
while [ $elapsed -lt $max_wait ]; do
|
|
36
|
-
if
|
|
69
|
+
if check_port "$port"; then
|
|
37
70
|
log_info "端口 $port 已就绪!(等待了 ${elapsed} 秒)"
|
|
38
71
|
return 0
|
|
39
72
|
fi
|
|
@@ -50,19 +83,77 @@ wait_for_port() {
|
|
|
50
83
|
return 1
|
|
51
84
|
}
|
|
52
85
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
86
|
+
# Docker 模式:重启服务
|
|
87
|
+
restart_docker() {
|
|
88
|
+
# 检查当前状态
|
|
89
|
+
log_info "当前 OpenClaw 服务状态:"
|
|
90
|
+
local pid
|
|
91
|
+
pid=$(get_openclaw_pid)
|
|
92
|
+
if [ -n "$pid" ]; then
|
|
93
|
+
log_info "服务正在运行(PID: $pid)"
|
|
94
|
+
else
|
|
95
|
+
log_warn "服务未运行"
|
|
96
|
+
fi
|
|
97
|
+
|
|
98
|
+
# 如果正在运行,先停止
|
|
99
|
+
if [ -n "$pid" ]; then
|
|
100
|
+
log_info "正在停止 OpenClaw 服务..."
|
|
101
|
+
kill "$pid" &>/dev/null || true
|
|
102
|
+
|
|
103
|
+
# 等待停止(最多 5 秒)
|
|
104
|
+
local elapsed=0
|
|
105
|
+
while [ $elapsed -lt 5 ]; do
|
|
106
|
+
if [ -z "$(get_openclaw_pid)" ]; then
|
|
107
|
+
break
|
|
108
|
+
fi
|
|
109
|
+
sleep 1
|
|
110
|
+
elapsed=$((elapsed + 1))
|
|
111
|
+
done
|
|
112
|
+
|
|
113
|
+
# 如果还在运行,强制停止
|
|
114
|
+
if [ -n "$(get_openclaw_pid)" ]; then
|
|
115
|
+
log_warn "服务未在 5 秒内停止,正在强制停止..."
|
|
116
|
+
kill -9 "$pid" &>/dev/null || true
|
|
117
|
+
sleep 1
|
|
118
|
+
fi
|
|
119
|
+
|
|
120
|
+
log_info "服务已停止"
|
|
121
|
+
fi
|
|
122
|
+
|
|
123
|
+
# 检查 openclaw 命令是否存在
|
|
124
|
+
if ! command -v openclaw &>/dev/null; then
|
|
125
|
+
log_error "openclaw 命令未找到,请先安装 OpenClaw。"
|
|
126
|
+
exit 1
|
|
127
|
+
fi
|
|
128
|
+
|
|
129
|
+
# 确保日志目录存在
|
|
130
|
+
local log_dir="/tmp/openclaw"
|
|
131
|
+
mkdir -p "$log_dir"
|
|
132
|
+
|
|
133
|
+
# 生成日志文件路径
|
|
134
|
+
local log_file="$log_dir/openclaw-$(date +%Y-%m-%d).log"
|
|
135
|
+
|
|
136
|
+
log_info "正在启动 OpenClaw 服务..."
|
|
137
|
+
|
|
138
|
+
# 使用 nohup 后台启动
|
|
139
|
+
nohup openclaw gateway --port "$PORT" > "$log_file" 2>&1 &
|
|
140
|
+
|
|
141
|
+
log_info "OpenClaw 服务启动命令已发送(PID: $!)"
|
|
142
|
+
log_info "日志文件: $log_file"
|
|
143
|
+
|
|
144
|
+
# 等待端口就绪
|
|
145
|
+
if wait_for_port "$PORT" "$MAX_WAIT"; then
|
|
146
|
+
log_info "OpenClaw 服务已完全重启!"
|
|
147
|
+
log_info "控制界面访问地址: http://127.0.0.1:$PORT/"
|
|
148
|
+
log_info "Success"
|
|
149
|
+
else
|
|
150
|
+
log_error "服务重启超时,请检查日志:$log_file"
|
|
151
|
+
exit 1
|
|
152
|
+
fi
|
|
56
153
|
}
|
|
57
154
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
case $1 in
|
|
61
|
-
-h|--help) show_help; exit 0 ;;
|
|
62
|
-
*) log_error "未知选项: $1"; exit 1 ;;
|
|
63
|
-
esac
|
|
64
|
-
done
|
|
65
|
-
|
|
155
|
+
# Systemd 模式:重启服务
|
|
156
|
+
restart_systemd() {
|
|
66
157
|
check_service
|
|
67
158
|
|
|
68
159
|
log_info "当前 OpenClaw 服务状态:"
|
|
@@ -82,11 +173,9 @@ main() {
|
|
|
82
173
|
exit 1
|
|
83
174
|
fi
|
|
84
175
|
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
if wait_for_port "$port" "$MAX_WAIT"; then
|
|
176
|
+
if wait_for_port "$PORT" "$MAX_WAIT"; then
|
|
88
177
|
log_info "OpenClaw 服务已完全重启!"
|
|
89
|
-
log_info "控制界面访问地址: http://127.0.0.1:$
|
|
178
|
+
log_info "控制界面访问地址: http://127.0.0.1:$PORT/"
|
|
90
179
|
log_info "Success"
|
|
91
180
|
else
|
|
92
181
|
log_error "服务重启超时,请检查日志:"
|
|
@@ -95,4 +184,32 @@ main() {
|
|
|
95
184
|
fi
|
|
96
185
|
}
|
|
97
186
|
|
|
98
|
-
|
|
187
|
+
# 检查 systemd 服务是否存在
|
|
188
|
+
check_service() {
|
|
189
|
+
if ! systemctl --user list-unit-files "$SERVICE_NAME" &>/dev/null; then
|
|
190
|
+
log_error "服务 $SERVICE_NAME 不存在。请先运行 'openclaw gateway install' 安装服务。"
|
|
191
|
+
exit 1
|
|
192
|
+
fi
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
show_help() {
|
|
196
|
+
echo "OpenClaw 服务重启脚本"
|
|
197
|
+
echo "用法: $0 [-h|--help]"
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
main() {
|
|
201
|
+
while [ $# -gt 0 ]; do
|
|
202
|
+
case $1 in
|
|
203
|
+
-h|--help) show_help; exit 0 ;;
|
|
204
|
+
*) log_error "未知选项: $1"; exit 1 ;;
|
|
205
|
+
esac
|
|
206
|
+
done
|
|
207
|
+
|
|
208
|
+
if is_docker; then
|
|
209
|
+
restart_docker
|
|
210
|
+
else
|
|
211
|
+
restart_systemd
|
|
212
|
+
fi
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
main "$@"
|
package/command/linux/start.sh
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
# OpenClaw 服务启动脚本
|
|
4
4
|
# 用法: ./start.sh [选项]
|
|
5
|
+
# 支持 systemd 和 Docker(无 systemd)双模式
|
|
5
6
|
|
|
6
7
|
set -e
|
|
7
8
|
|
|
@@ -17,14 +18,46 @@ log_error() { echo -e "${RED}[ERROR]${NC} $1"; }
|
|
|
17
18
|
|
|
18
19
|
SERVICE_NAME="openclaw-gateway.service"
|
|
19
20
|
MAX_WAIT=300 # 最长等待5分钟
|
|
21
|
+
PORT="18789"
|
|
20
22
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
23
|
+
# 检测是否在 Docker 环境(无 systemd)
|
|
24
|
+
is_docker() {
|
|
25
|
+
if ! command -v systemctl &>/dev/null; then
|
|
26
|
+
return 0 # 无 systemctl,认为是 Docker
|
|
27
|
+
fi
|
|
28
|
+
return 1
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
# 获取 openclaw 进程 PID
|
|
32
|
+
get_openclaw_pid() {
|
|
33
|
+
# 只通过端口查找进程(最可靠,避免僵尸进程和误匹配)
|
|
34
|
+
if command -v netstat &>/dev/null; then
|
|
35
|
+
local pid
|
|
36
|
+
pid=$(netstat -tnlp 2>/dev/null | grep ":18789 " | head -1 | awk '{print $7}' | cut -d'/' -f1)
|
|
37
|
+
if [ -n "$pid" ]; then
|
|
38
|
+
echo "$pid"
|
|
39
|
+
return
|
|
40
|
+
fi
|
|
25
41
|
fi
|
|
42
|
+
|
|
43
|
+
# 没有监听端口,返回空(不再使用 pgrep 避免误匹配)
|
|
44
|
+
echo ""
|
|
26
45
|
}
|
|
27
46
|
|
|
47
|
+
# 检查端口是否监听
|
|
48
|
+
check_port() {
|
|
49
|
+
local port=$1
|
|
50
|
+
if command -v ss &>/dev/null; then
|
|
51
|
+
ss -tln | grep -q ":$port "
|
|
52
|
+
elif command -v netstat &>/dev/null; then
|
|
53
|
+
netstat -tln | grep -q ":$port "
|
|
54
|
+
else
|
|
55
|
+
# 降级:直接检查进程
|
|
56
|
+
[ -n "$(get_openclaw_pid)" ]
|
|
57
|
+
fi
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
# 等待端口启动
|
|
28
61
|
wait_for_port() {
|
|
29
62
|
local port=$1
|
|
30
63
|
local max_wait=$2
|
|
@@ -33,7 +66,7 @@ wait_for_port() {
|
|
|
33
66
|
log_info "等待端口 $port 启动(最长等待 ${max_wait} 秒)..."
|
|
34
67
|
|
|
35
68
|
while [ $elapsed -lt $max_wait ]; do
|
|
36
|
-
if
|
|
69
|
+
if check_port "$port"; then
|
|
37
70
|
log_info "端口 $port 已就绪!(等待了 ${elapsed} 秒)"
|
|
38
71
|
return 0
|
|
39
72
|
fi
|
|
@@ -50,26 +83,60 @@ wait_for_port() {
|
|
|
50
83
|
return 1
|
|
51
84
|
}
|
|
52
85
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
86
|
+
# Docker 模式:启动服务
|
|
87
|
+
start_docker() {
|
|
88
|
+
# 检查是否已在运行
|
|
89
|
+
local pid
|
|
90
|
+
pid=$(get_openclaw_pid)
|
|
91
|
+
if [ -n "$pid" ]; then
|
|
92
|
+
log_info "OpenClaw 服务已经在运行中。"
|
|
93
|
+
if check_port "$PORT"; then
|
|
94
|
+
log_info "控制界面访问地址: http://127.0.0.1:$PORT/"
|
|
95
|
+
fi
|
|
96
|
+
log_info "Success"
|
|
97
|
+
exit 0
|
|
98
|
+
fi
|
|
99
|
+
|
|
100
|
+
# 检查 openclaw 命令是否存在
|
|
101
|
+
if ! command -v openclaw &>/dev/null; then
|
|
102
|
+
log_error "openclaw 命令未找到,请先安装 OpenClaw。"
|
|
103
|
+
exit 1
|
|
104
|
+
fi
|
|
105
|
+
|
|
106
|
+
# 确保日志目录存在
|
|
107
|
+
local log_dir="/tmp/openclaw"
|
|
108
|
+
mkdir -p "$log_dir"
|
|
109
|
+
|
|
110
|
+
# 生成日志文件路径
|
|
111
|
+
local log_file="$log_dir/openclaw-$(date +%Y-%m-%d).log"
|
|
112
|
+
|
|
113
|
+
log_info "正在启动 OpenClaw 服务..."
|
|
114
|
+
|
|
115
|
+
# 使用 nohup 后台启动
|
|
116
|
+
nohup openclaw gateway --port "$PORT" > "$log_file" 2>&1 &
|
|
117
|
+
|
|
118
|
+
log_info "OpenClaw 服务启动命令已发送(PID: $!)"
|
|
119
|
+
log_info "日志文件: $log_file"
|
|
120
|
+
|
|
121
|
+
# 等待端口就绪
|
|
122
|
+
if wait_for_port "$PORT" "$MAX_WAIT"; then
|
|
123
|
+
log_info "OpenClaw 服务已完全启动!"
|
|
124
|
+
log_info "控制界面访问地址: http://127.0.0.1:$PORT/"
|
|
125
|
+
log_info "Success"
|
|
126
|
+
else
|
|
127
|
+
log_error "服务启动超时,请检查日志:$log_file"
|
|
128
|
+
exit 1
|
|
129
|
+
fi
|
|
56
130
|
}
|
|
57
131
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
case $1 in
|
|
61
|
-
-h|--help) show_help; exit 0 ;;
|
|
62
|
-
*) log_error "未知选项: $1"; exit 1 ;;
|
|
63
|
-
esac
|
|
64
|
-
done
|
|
65
|
-
|
|
132
|
+
# Systemd 模式:启动服务
|
|
133
|
+
start_systemd() {
|
|
66
134
|
check_service
|
|
67
135
|
|
|
68
136
|
if systemctl --user is-active --quiet "$SERVICE_NAME"; then
|
|
69
137
|
log_info "OpenClaw 服务已经在运行中。"
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
log_info "控制界面访问地址: http://127.0.0.1:$port/"
|
|
138
|
+
if check_port "$PORT"; then
|
|
139
|
+
log_info "控制界面访问地址: http://127.0.0.1:$PORT/"
|
|
73
140
|
fi
|
|
74
141
|
log_info "Success"
|
|
75
142
|
exit 0
|
|
@@ -85,11 +152,9 @@ main() {
|
|
|
85
152
|
exit 1
|
|
86
153
|
fi
|
|
87
154
|
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
if wait_for_port "$port" "$MAX_WAIT"; then
|
|
155
|
+
if wait_for_port "$PORT" "$MAX_WAIT"; then
|
|
91
156
|
log_info "OpenClaw 服务已完全启动!"
|
|
92
|
-
log_info "控制界面访问地址: http://127.0.0.1:$
|
|
157
|
+
log_info "控制界面访问地址: http://127.0.0.1:$PORT/"
|
|
93
158
|
log_info "Success"
|
|
94
159
|
else
|
|
95
160
|
log_error "服务启动超时,请检查日志:"
|
|
@@ -98,4 +163,32 @@ main() {
|
|
|
98
163
|
fi
|
|
99
164
|
}
|
|
100
165
|
|
|
101
|
-
|
|
166
|
+
# 检查 systemd 服务是否存在
|
|
167
|
+
check_service() {
|
|
168
|
+
if ! systemctl --user list-unit-files "$SERVICE_NAME" &>/dev/null; then
|
|
169
|
+
log_error "服务 $SERVICE_NAME 不存在。请先运行 'openclaw gateway install' 安装服务。"
|
|
170
|
+
exit 1
|
|
171
|
+
fi
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
show_help() {
|
|
175
|
+
echo "OpenClaw 服务启动脚本"
|
|
176
|
+
echo "用法: $0 [-h|--help]"
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
main() {
|
|
180
|
+
while [ $# -gt 0 ]; do
|
|
181
|
+
case $1 in
|
|
182
|
+
-h|--help) show_help; exit 0 ;;
|
|
183
|
+
*) log_error "未知选项: $1"; exit 1 ;;
|
|
184
|
+
esac
|
|
185
|
+
done
|
|
186
|
+
|
|
187
|
+
if is_docker; then
|
|
188
|
+
start_docker
|
|
189
|
+
else
|
|
190
|
+
start_systemd
|
|
191
|
+
fi
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
main "$@"
|
package/command/linux/status.sh
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
# OpenClaw 服务状态查看脚本
|
|
4
4
|
# 用法: ./status.sh [选项]
|
|
5
|
+
# 支持 systemd 和 Docker(无 systemd)双模式
|
|
5
6
|
|
|
6
7
|
set -e
|
|
7
8
|
|
|
@@ -31,48 +32,130 @@ log_header() {
|
|
|
31
32
|
|
|
32
33
|
# 服务名称
|
|
33
34
|
SERVICE_NAME="openclaw-gateway.service"
|
|
35
|
+
PORT="18789"
|
|
34
36
|
|
|
35
|
-
#
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
37
|
+
# 检测是否在 Docker 环境(无 systemd)
|
|
38
|
+
is_docker() {
|
|
39
|
+
if ! command -v systemctl &>/dev/null; then
|
|
40
|
+
return 0 # 无 systemctl,认为是 Docker
|
|
41
|
+
fi
|
|
42
|
+
return 1
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
# 获取 openclaw 进程 PID
|
|
46
|
+
get_openclaw_pid() {
|
|
47
|
+
# 只通过端口查找进程(最可靠,避免僵尸进程和误匹配)
|
|
48
|
+
if command -v netstat &>/dev/null; then
|
|
49
|
+
local pid
|
|
50
|
+
pid=$(netstat -tnlp 2>/dev/null | grep ":18789 " | head -1 | awk '{print $7}' | cut -d'/' -f1)
|
|
51
|
+
if [ -n "$pid" ]; then
|
|
52
|
+
echo "$pid"
|
|
53
|
+
return
|
|
54
|
+
fi
|
|
55
|
+
fi
|
|
56
|
+
|
|
57
|
+
# 没有监听端口,返回空(不再使用 pgrep 避免误匹配)
|
|
44
58
|
echo ""
|
|
45
|
-
echo "示例:"
|
|
46
|
-
echo " $0 显示详细状态"
|
|
47
|
-
echo " $0 -q 只输出状态"
|
|
48
59
|
}
|
|
49
60
|
|
|
50
|
-
#
|
|
51
|
-
|
|
52
|
-
local
|
|
61
|
+
# 检查端口是否监听
|
|
62
|
+
check_port() {
|
|
63
|
+
local port=$1
|
|
64
|
+
if command -v ss &>/dev/null; then
|
|
65
|
+
ss -tln | grep -q ":$port "
|
|
66
|
+
elif command -v netstat &>/dev/null; then
|
|
67
|
+
netstat -tln | grep -q ":$port "
|
|
68
|
+
else
|
|
69
|
+
# 降级:直接检查进程
|
|
70
|
+
[ -n "$(get_openclaw_pid)" ]
|
|
71
|
+
fi
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
# Docker 模式:查看状态
|
|
75
|
+
status_docker() {
|
|
76
|
+
local quiet="$1"
|
|
77
|
+
local pid
|
|
78
|
+
pid=$(get_openclaw_pid)
|
|
53
79
|
|
|
54
|
-
#
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
80
|
+
# 以端口检测为主要判断依据(避免僵尸进程导致误判)
|
|
81
|
+
local is_running=""
|
|
82
|
+
if check_port "$PORT"; then
|
|
83
|
+
is_running="1"
|
|
84
|
+
fi
|
|
85
|
+
|
|
86
|
+
# 静默模式
|
|
87
|
+
if [ "$quiet" = "1" ]; then
|
|
88
|
+
if [ "$is_running" = "1" ]; then
|
|
89
|
+
echo "running"
|
|
90
|
+
else
|
|
91
|
+
echo "stopped"
|
|
92
|
+
fi
|
|
93
|
+
exit 0
|
|
94
|
+
fi
|
|
95
|
+
|
|
96
|
+
# 详细模式:模拟 systemctl 输出格式
|
|
97
|
+
log_header "OpenClaw 服务状态"
|
|
98
|
+
echo
|
|
99
|
+
log_info "服务状态:"
|
|
100
|
+
|
|
101
|
+
if [ "$is_running" = "1" ]; then
|
|
102
|
+
# 运行中:模拟 systemctl 的 active (running) 格式
|
|
103
|
+
echo "● openclaw-gateway.service - OpenClaw Gateway"
|
|
104
|
+
echo " Loaded: loaded (Docker 模式)"
|
|
105
|
+
echo " Active: active (running)"
|
|
106
|
+
if [ -n "$pid" ]; then
|
|
107
|
+
echo " Main PID: $pid (openclaw-gateway)"
|
|
108
|
+
fi
|
|
109
|
+
echo ""
|
|
110
|
+
log_info "Success"
|
|
111
|
+
else
|
|
112
|
+
# 未运行:模拟 systemctl 的 inactive (dead) 格式
|
|
113
|
+
echo "○ openclaw-gateway.service - OpenClaw Gateway"
|
|
114
|
+
echo " Loaded: loaded (Docker 模式)"
|
|
115
|
+
echo " Active: inactive (dead)"
|
|
116
|
+
echo ""
|
|
117
|
+
log_info "未启动"
|
|
118
|
+
fi
|
|
119
|
+
|
|
120
|
+
echo
|
|
121
|
+
log_header "配置信息"
|
|
122
|
+
|
|
123
|
+
# 显示配置目录
|
|
124
|
+
if [ -d "$HOME/.openclaw" ]; then
|
|
125
|
+
log_info "配置目录: $HOME/.openclaw"
|
|
126
|
+
if [ -f "$HOME/.openclaw/openclaw.json" ]; then
|
|
127
|
+
log_info "配置文件: 存在"
|
|
128
|
+
else
|
|
129
|
+
log_warn "配置文件: 不存在"
|
|
130
|
+
fi
|
|
131
|
+
else
|
|
132
|
+
log_warn "配置目录不存在"
|
|
133
|
+
fi
|
|
134
|
+
|
|
135
|
+
echo
|
|
136
|
+
log_header "访问信息"
|
|
137
|
+
|
|
138
|
+
# 尝试从配置中读取端口
|
|
139
|
+
local port="$PORT"
|
|
140
|
+
if [ -f "$HOME/.openclaw/openclaw.json" ] && command -v jq &>/dev/null; then
|
|
141
|
+
local config_port
|
|
142
|
+
config_port=$(jq -r '.gateway.port // empty' "$HOME/.openclaw/openclaw.json" 2>/dev/null || echo "")
|
|
143
|
+
if [ -n "$config_port" ]; then
|
|
144
|
+
port="$config_port"
|
|
145
|
+
fi
|
|
146
|
+
fi
|
|
147
|
+
|
|
148
|
+
log_info "默认访问地址: http://127.0.0.1:$port/"
|
|
149
|
+
log_info "WebSocket 地址: ws://127.0.0.1:$port"
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
# Systemd 模式:查看状态
|
|
153
|
+
status_systemd() {
|
|
154
|
+
local quiet="$1"
|
|
72
155
|
|
|
73
156
|
# 检查服务是否存在
|
|
74
157
|
if ! systemctl --user list-unit-files "$SERVICE_NAME" &>/dev/null; then
|
|
75
|
-
if [
|
|
158
|
+
if [ "$quiet" = "1" ]; then
|
|
76
159
|
echo "not_installed"
|
|
77
160
|
else
|
|
78
161
|
log_error "服务 $SERVICE_NAME 未安装。"
|
|
@@ -80,8 +163,8 @@ main() {
|
|
|
80
163
|
exit 1
|
|
81
164
|
fi
|
|
82
165
|
|
|
83
|
-
#
|
|
84
|
-
if [
|
|
166
|
+
# 静默模式
|
|
167
|
+
if [ "$quiet" = "1" ]; then
|
|
85
168
|
if systemctl --user is-active --quiet "$SERVICE_NAME"; then
|
|
86
169
|
echo "running"
|
|
87
170
|
else
|
|
@@ -109,9 +192,9 @@ main() {
|
|
|
109
192
|
log_header "配置信息"
|
|
110
193
|
|
|
111
194
|
# 显示配置目录
|
|
112
|
-
if [
|
|
195
|
+
if [ -d "$HOME/.openclaw" ]; then
|
|
113
196
|
log_info "配置目录: $HOME/.openclaw"
|
|
114
|
-
if [
|
|
197
|
+
if [ -f "$HOME/.openclaw/openclaw.json" ]; then
|
|
115
198
|
log_info "配置文件: 存在"
|
|
116
199
|
else
|
|
117
200
|
log_warn "配置文件: 不存在"
|
|
@@ -124,10 +207,11 @@ main() {
|
|
|
124
207
|
log_header "访问信息"
|
|
125
208
|
|
|
126
209
|
# 尝试从配置中读取端口
|
|
127
|
-
local port="
|
|
128
|
-
if [
|
|
129
|
-
local config_port
|
|
130
|
-
|
|
210
|
+
local port="$PORT"
|
|
211
|
+
if [ -f "$HOME/.openclaw/openclaw.json" ] && command -v jq &>/dev/null; then
|
|
212
|
+
local config_port
|
|
213
|
+
config_port=$(jq -r '.gateway.port // empty' "$HOME/.openclaw/openclaw.json" 2>/dev/null || echo "")
|
|
214
|
+
if [ -n "$config_port" ]; then
|
|
131
215
|
port="$config_port"
|
|
132
216
|
fi
|
|
133
217
|
fi
|
|
@@ -136,5 +220,50 @@ main() {
|
|
|
136
220
|
log_info "WebSocket 地址: ws://127.0.0.1:$port"
|
|
137
221
|
}
|
|
138
222
|
|
|
223
|
+
# 显示帮助信息
|
|
224
|
+
show_help() {
|
|
225
|
+
echo "OpenClaw 服务状态查看脚本"
|
|
226
|
+
echo ""
|
|
227
|
+
echo "用法: $0 [选项]"
|
|
228
|
+
echo ""
|
|
229
|
+
echo "选项:"
|
|
230
|
+
echo " -q, --quiet 静默模式(只输出 running/stopped)"
|
|
231
|
+
echo " -h, --help 显示此帮助信息"
|
|
232
|
+
echo ""
|
|
233
|
+
echo "示例:"
|
|
234
|
+
echo " $0 显示详细状态"
|
|
235
|
+
echo " $0 -q 只输出状态"
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
# 主函数
|
|
239
|
+
main() {
|
|
240
|
+
local quiet=""
|
|
241
|
+
|
|
242
|
+
# 解析命令行参数
|
|
243
|
+
while [ $# -gt 0 ]; do
|
|
244
|
+
case $1 in
|
|
245
|
+
-q|--quiet)
|
|
246
|
+
quiet="1"
|
|
247
|
+
shift
|
|
248
|
+
;;
|
|
249
|
+
-h|--help)
|
|
250
|
+
show_help
|
|
251
|
+
exit 0
|
|
252
|
+
;;
|
|
253
|
+
*)
|
|
254
|
+
log_error "未知选项: $1"
|
|
255
|
+
show_help
|
|
256
|
+
exit 1
|
|
257
|
+
;;
|
|
258
|
+
esac
|
|
259
|
+
done
|
|
260
|
+
|
|
261
|
+
if is_docker; then
|
|
262
|
+
status_docker "$quiet"
|
|
263
|
+
else
|
|
264
|
+
status_systemd "$quiet"
|
|
265
|
+
fi
|
|
266
|
+
}
|
|
267
|
+
|
|
139
268
|
# 执行主函数
|
|
140
|
-
main "$@"
|
|
269
|
+
main "$@"
|