Skip to content

Commit 0e3505f

Browse files
author
farfarfun
committed
feat: format status output as table, align columns, paperclip port 8804
1 parent 4576323 commit 0e3505f

2 files changed

Lines changed: 73 additions & 63 deletions

File tree

scripts/services/nlt-services.sh

Lines changed: 70 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ usage() {
3333
无参数:gum 菜单(status / install / help / quit)。
3434
3535
命令:
36-
status [--no-http] 汇总 Airflow、Celery、Paperclip、code-server、new-api(PID、端口、可选 HTTP 探测)
36+
status [--no-http] 以表格汇总 Airflow、Celery、Paperclip、code-server、new-api(PID、端口、可选 HTTP 探测)
3737
install 无参:gum 先选「安装 / 卸载」,再选模块。
3838
install add <模块> 安装(add 可写 install)
3939
install remove <模块> 卸载(remove 可写 uninstall;celery/utils 不支持)
@@ -90,9 +90,22 @@ http_probe() {
9090
fi
9191
}
9292

93-
section() {
94-
echo ""
95-
echo "── $* ──"
93+
# 制表符行 → column -t 对齐(无 column 时原样输出)
94+
_print_table() {
95+
if command -v column >/dev/null 2>&1; then
96+
column -t -s $'\t'
97+
else
98+
cat
99+
fi
100+
}
101+
102+
# 单行五列(服务、状态、PID、端口/访问、HTTP),字段内勿含制表符
103+
_status_row() {
104+
printf '%s\t%s\t%s\t%s\t%s\n' "$1" "$2" "$3" "$4" "$5"
105+
}
106+
107+
_mark_alive() {
108+
proc_alive "$1" && printf '%s' '' || printf '%s' '×'
96109
}
97110

98111
cmd_status() {
@@ -127,7 +140,7 @@ cmd_status() {
127140
pid_cel_f="$(read_pid_file "${CELERY_RUN}/flower.pid")"
128141

129142
PAPERCLIP_SERVICE_HOME="${PAPERCLIP_SERVICE_HOME:-${HOME}/opt/paperclip}"
130-
PAPERCLIP_PORT="${PAPERCLIP_PORT:-3100}"
143+
PAPERCLIP_PORT="${PAPERCLIP_PORT:-8804}"
131144
pid_pc="$(read_pid_file "${PAPERCLIP_SERVICE_HOME}/run/paperclip.pid")"
132145

133146
CODE_SERVER_SERVICE_HOME="${CODE_SERVER_SERVICE_HOME:-${HOME}/opt/code-server}"
@@ -139,66 +152,62 @@ cmd_status() {
139152
NEW_API_PORT="${NEW_API_PORT:-3000}"
140153
pid_na="$(read_pid_file "${NEW_API_SERVICE_HOME}/run/new-api.pid")"
141154

142-
echo "nltdeploy 服务概览(PID / 端口 / 地址)"
143-
echo "时间: $(date '+%Y-%m-%d %H:%M:%S %z')"
144-
145-
section "Airflow 3(standalone)"
146-
echo " 名称: Airflow standalone"
147-
echo " 安装: ${AIRFLOW_HOME}"
148-
echo " PID 文件: ${AIRFLOW_PID_FILE}"
149-
echo " 进程: $(status_word "$airflow_pid") ${airflow_pid:--}"
150-
echo " 端口: ${AIRFLOW_PORT}(环境变量 AIRFLOW__WEBSERVER__WEB_SERVER_PORT)"
151-
echo " 地址: http://127.0.0.1:${AIRFLOW_PORT}/"
152-
echo " 探测: $(http_probe "http://127.0.0.1:${AIRFLOW_PORT}/")"
153-
echo " 详情: nlt-airflow status"
154-
155-
section "Celery(worker / beat / flower)"
156-
echo " 名称: Celery"
157-
echo " 安装: ${CELERY_HOME}"
158-
echo " 提示: Flower 默认端口与 Airflow Web 相同(8806);并行部署时请设置 FLOWER_PORT"
159-
echo " worker: $(status_word "$pid_cel_w") PID ${pid_cel_w:--}"
160-
echo " beat: $(status_word "$pid_cel_b") PID ${pid_cel_b:--}"
161-
echo " flower: $(status_word "$pid_cel_f") PID ${pid_cel_f:--} 端口 ${FLOWER_PORT} 监听 ${FLOWER_ADDRESS}"
155+
local ts flower_url cel_wbf cel_pids cel_probe
156+
ts="$(date '+%Y-%m-%d %H:%M:%S %z')"
157+
162158
if [[ "$FLOWER_ADDRESS" == "0.0.0.0" ]]; then
163-
echo " Flower URL: http://127.0.0.1:${FLOWER_PORT}/"
164-
echo " 探测: $(http_probe "http://127.0.0.1:${FLOWER_PORT}/")"
159+
flower_url="http://127.0.0.1:${FLOWER_PORT}/"
165160
else
166-
echo " Flower URL: http://${FLOWER_ADDRESS}:${FLOWER_PORT}/"
167-
echo " 探测: $(http_probe "http://${FLOWER_ADDRESS}:${FLOWER_PORT}/")"
161+
flower_url="http://${FLOWER_ADDRESS}:${FLOWER_PORT}/"
168162
fi
169-
echo " 详情: nlt-celery status"
170-
171-
section "Paperclip"
172-
echo " 名称: Paperclip"
173-
echo " 安装: ${PAPERCLIP_SERVICE_HOME}"
174-
echo " 进程: $(status_word "$pid_pc") ${pid_pc:--}"
175-
echo " 端口: ${PAPERCLIP_PORT}(PAPERCLIP_PORT)"
176-
echo " 健康检查: http://127.0.0.1:${PAPERCLIP_PORT}/api/health"
177-
echo " 探测: $(http_probe "http://127.0.0.1:${PAPERCLIP_PORT}/api/health")"
178-
echo " 详情: nlt-paperclip status"
179-
180-
section "code-server"
181-
echo " 名称: code-server"
182-
echo " 安装: ${CODE_SERVER_SERVICE_HOME}"
183-
echo " 进程: $(status_word "$pid_cs") ${pid_cs:--}"
184-
echo " 绑定: ${CODE_SERVER_BIND}(CODE_SERVER_BIND)"
185-
echo " 探测 URL: http://127.0.0.1:${CODE_SERVER_PORT}/"
186-
echo " 探测: $(http_probe "http://127.0.0.1:${CODE_SERVER_PORT}/")"
187-
echo " 详情: nlt-code-server status"
188-
189-
section "new-api"
190-
echo " 名称: new-api(QuantumNous/new-api)"
191-
echo " 安装: ${NEW_API_SERVICE_HOME}"
192-
echo " 进程: $(status_word "$pid_na") ${pid_na:--}"
193-
echo " 端口: ${NEW_API_PORT}(NEW_API_PORT / PORT)"
194-
echo " 地址: http://127.0.0.1:${NEW_API_PORT}/"
195-
echo " 探测: $(http_probe "http://127.0.0.1:${NEW_API_PORT}/")"
196-
echo " 详情: nlt-new-api status"
197-
198-
section "工具(无统一守护进程)"
199-
echo " nlt-pip-sources / nlt-python-env / nlt-utils / nlt-github-net"
200-
echo " 请使用各命令的 install、status(若有)等子命令单独查看。"
163+
cel_probe="$(http_probe "$flower_url")"
164+
cel_wbf="$(_mark_alive "$pid_cel_w")$(_mark_alive "$pid_cel_b")$(_mark_alive "$pid_cel_f")"
165+
cel_pids="${pid_cel_w:--}/${pid_cel_b:--}/${pid_cel_f:--}"
166+
167+
echo "nltdeploy 服务概览(表格) ${ts}"
168+
echo ""
201169

170+
{
171+
_status_row "服务" "状态" "PID" "端口/访问" "HTTP"
172+
_status_row \
173+
"airflow" \
174+
"$(status_word "$airflow_pid")" \
175+
"${airflow_pid:--}" \
176+
"${AIRFLOW_PORT} → 127.0.0.1:${AIRFLOW_PORT}" \
177+
"$(http_probe "http://127.0.0.1:${AIRFLOW_PORT}/")"
178+
_status_row \
179+
"celery" \
180+
"wbf ${cel_wbf}" \
181+
"${cel_pids}" \
182+
"flower ${FLOWER_PORT} (${FLOWER_ADDRESS})" \
183+
"${cel_probe}"
184+
_status_row \
185+
"paperclip" \
186+
"$(status_word "$pid_pc")" \
187+
"${pid_pc:--}" \
188+
"${PAPERCLIP_PORT} /api/health" \
189+
"$(http_probe "http://127.0.0.1:${PAPERCLIP_PORT}/api/health")"
190+
_status_row \
191+
"code-server" \
192+
"$(status_word "$pid_cs")" \
193+
"${pid_cs:--}" \
194+
"${CODE_SERVER_BIND}" \
195+
"$(http_probe "http://127.0.0.1:${CODE_SERVER_PORT}/")"
196+
_status_row \
197+
"new-api" \
198+
"$(status_word "$pid_na")" \
199+
"${pid_na:--}" \
200+
"${NEW_API_PORT} → 127.0.0.1:${NEW_API_PORT}" \
201+
"$(http_probe "http://127.0.0.1:${NEW_API_PORT}/")"
202+
} | _print_table
203+
204+
echo ""
205+
echo "说明:"
206+
echo " • celery 状态列 wbf 为 worker / beat / flower:√ 运行中,× 未运行;与 Airflow 同机时请区分 FLOWER_PORT。"
207+
echo " • 安装路径: airflow ${AIRFLOW_HOME} | celery ${CELERY_HOME} | paperclip ${PAPERCLIP_SERVICE_HOME} | code-server ${CODE_SERVER_SERVICE_HOME} | new-api ${NEW_API_SERVICE_HOME}"
208+
echo " • 详情: nlt-airflow / nlt-celery / nlt-paperclip / nlt-code-server / nlt-new-api 各 status"
209+
echo ""
210+
echo "工具(无统一守护进程): nlt-pip-sources / nlt-python-env / nlt-utils / nlt-github-net — 请用各命令单独查看。"
202211
echo ""
203212
}
204213

scripts/services/paperclip/setup.sh

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
# PAPERCLIP_SERVICE_HOME 本脚本管理根目录(默认 ~/opt/paperclip)
1616
# PAPERCLIP_REPO_URL 上游 Git(默认 https://github.com/paperclipai/paperclip.git)
1717
# PAPERCLIP_GIT_BRANCH 克隆分支(默认 main)
18-
# PAPERCLIP_PORT 健康检查端口(默认 3100
18+
# PAPERCLIP_PORT 监听与健康检查端口(默认 8804;启动时 export PORT 同值
1919
# NONINTERACTIVE=1 跳过 gum 确认
2020
# PAPERCLIP_UNINSTALL_YES=1 非 TTY 卸载确认
2121

@@ -36,7 +36,7 @@ fi
3636
PAPERCLIP_SERVICE_HOME="${PAPERCLIP_SERVICE_HOME:-${HOME}/opt/paperclip}"
3737
PAPERCLIP_REPO_URL="${PAPERCLIP_REPO_URL:-https://github.com/paperclipai/paperclip.git}"
3838
PAPERCLIP_GIT_BRANCH="${PAPERCLIP_GIT_BRANCH:-main}"
39-
PAPERCLIP_PORT="${PAPERCLIP_PORT:-3100}"
39+
PAPERCLIP_PORT="${PAPERCLIP_PORT:-8804}"
4040

4141
PAPERCLIP_SRC="${PAPERCLIP_SRC:-${PAPERCLIP_SERVICE_HOME}/src/paperclip}"
4242
PAPERCLIP_RUN_DIR="${PAPERCLIP_SERVICE_HOME}/run"
@@ -168,6 +168,7 @@ cmd_start() {
168168
echo "==> 启动 Paperclip(pnpm paperclipai run),日志: ${LOG_FILE}" >&2
169169
echo " 默认 UI/API: http://127.0.0.1:${PAPERCLIP_PORT}" >&2
170170
pushd "${PAPERCLIP_SRC}" >/dev/null
171+
export PORT="${PAPERCLIP_PORT}"
171172
nohup pnpm paperclipai run >>"${LOG_FILE}" 2>&1 &
172173
local cpid=$!
173174
echo "$cpid" >"$PID_FILE"

0 commit comments

Comments
 (0)