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.
@@ -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
- check_service() {
22
- if ! systemctl --user list-unit-files "$SERVICE_NAME" &>/dev/null; then
23
- log_error "服务 $SERVICE_NAME 不存在。请先运行 'openclaw gateway install' 安装服务。"
24
- exit 1
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 ss -tln | grep -q ":$port "; then
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
- show_help() {
54
- echo "OpenClaw 服务重启脚本"
55
- echo "用法: $0 [-h|--help]"
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
- main() {
59
- while [[ $# -gt 0 ]]; do
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
- local port="18789"
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:$port/"
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
- main "$@"
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 "$@"
@@ -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
- check_service() {
22
- if ! systemctl --user list-unit-files "$SERVICE_NAME" &>/dev/null; then
23
- log_error "服务 $SERVICE_NAME 不存在。请先运行 'openclaw gateway install' 安装服务。"
24
- exit 1
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 ss -tln | grep -q ":$port "; then
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
- show_help() {
54
- echo "OpenClaw 服务启动脚本"
55
- echo "用法: $0 [-h|--help]"
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
- main() {
59
- while [[ $# -gt 0 ]]; do
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
- local port="18789"
71
- if ss -tln | grep -q ":$port "; then
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
- local port="18789"
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:$port/"
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
- main "$@"
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 "$@"
@@ -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
- show_help() {
37
- echo "OpenClaw 服务状态查看脚本"
38
- echo ""
39
- echo "用法: $0 [选项]"
40
- echo ""
41
- echo "选项:"
42
- echo " -q, --quiet 静默模式(只输出 running/stopped)"
43
- echo " -h, --help 显示此帮助信息"
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
- main() {
52
- local quiet=""
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
- while [[ $# -gt 0 ]]; do
56
- case $1 in
57
- -q|--quiet)
58
- quiet="true"
59
- shift
60
- ;;
61
- -h|--help)
62
- show_help
63
- exit 0
64
- ;;
65
- *)
66
- log_error "未知选项: $1"
67
- show_help
68
- exit 1
69
- ;;
70
- esac
71
- done
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 [[ -n "$quiet" ]]; then
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 [[ -n "$quiet" ]]; then
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 [[ -d "$HOME/.openclaw" ]]; then
195
+ if [ -d "$HOME/.openclaw" ]; then
113
196
  log_info "配置目录: $HOME/.openclaw"
114
- if [[ -f "$HOME/.openclaw/openclaw.json" ]]; then
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="18789"
128
- if [[ -f "$HOME/.openclaw/openclaw.json" ]] && command -v jq &> /dev/null; then
129
- local config_port=$(jq -r '.gateway.port // empty' "$HOME/.openclaw/openclaw.json" 2>/dev/null)
130
- if [[ -n "$config_port" ]]; then
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 "$@"