用户实测:服务器没有 systemctl,install.sh 直接报错退出。
原错误信息本身也是错的(建议 SKIP_NGINX=1,但那只跳过 nginx,仍走 systemctl)。
进程管理改为四层降级:
systemd → OpenRC → SysVinit → nohup 后台进程(deploy/ctl.sh)
- 新增 deploy/ctl.sh:start/stop/restart/status/logs,PID 文件 + 进程名双重判定
- 新增 deploy/openrc/opendance-api、deploy/initd/opendance-api
- 无 init 系统时写 crontab @reboot 实现开机自启
- uninstall.sh 同步支持四种模式清理(原先只处理 systemd,会留下运行中的进程)
- 汇总输出按实际初始化系统给出对应运维命令
测试中发现并修复降级路径的两个真实缺陷:
1. nohup 无法调用 shell 函数
实测退出码 127 且什么都不执行
(nohup 是外部命令,只能执行可执行文件)。
这会让无 systemd 的降级路径完全失效——服务根本起不来。
改为按 runuser / setpriv / su 显式拼接成外部命令后再 nohup。
另加启动后 1 秒存活检测,失败立即打印日志,不再白等 30 秒。
2. find_pids 在无进程时返回一个空格
在空输入下仍会执行一次 echo,输出空行,
最终得到 " ";调用方 [ -n ... ] 会判为「有进程」,
导致 start 直接跳过、status 谎报运行中。改为纯 bash 拼接,空时返回空串。
实测(真实 API 进程,端口 3100):
start → 健康检查 200,PID 正确
重复 start → 识别已在运行,进程数保持 1
status → 运行中
restart → 新 PID,健康检查 200
stop → 无残留进程,端口释放
无 process 时 find_pids 返回空串,is_running=false
37 lines
1007 B
Plaintext
Executable File
37 lines
1007 B
Plaintext
Executable File
#!/sbin/openrc-run
|
|
# OpenDance Studio Web 管理服务端 —— OpenRC 服务脚本
|
|
#
|
|
# 安装位置:/etc/init.d/opendance-api
|
|
# rc-update add opendance-api default
|
|
# rc-service opendance-api start
|
|
|
|
name="opendance-api"
|
|
description="OpenDance Studio Web 管理服务端"
|
|
|
|
command="__NODE_BIN__"
|
|
command_args="__APP_DIR__/web-server/dist/main.js"
|
|
command_background="yes"
|
|
pidfile="/run/opendance-api.pid"
|
|
directory="__APP_DIR__/web-server"
|
|
command_user="__SERVICE_USER__:__SERVICE_USER__"
|
|
output_log="/var/log/opendance-api.log"
|
|
error_log="/var/log/opendance-api.log"
|
|
supervisor="supervise-daemon"
|
|
|
|
depend() {
|
|
need net
|
|
after firewall
|
|
use dns logger
|
|
}
|
|
|
|
start_pre() {
|
|
# 载入部署环境变量(OpenRC 没有 EnvironmentFile,用 start_pre 导出)
|
|
if [ -f "__APP_DIR__/deploy/.env" ]; then
|
|
set -a
|
|
# shellcheck disable=SC1091
|
|
. "__APP_DIR__/deploy/.env"
|
|
set +a
|
|
fi
|
|
checkpath --directory --owner __SERVICE_USER__:__SERVICE_USER__ /var/log
|
|
}
|