bash
#手动执行,确保有权限
chmod +x /opt/wap-blog/wap-server-linux
cat > /etc/init.d/wap-blog << 'EOF'
#!/sbin/openrc-run
name="wap-blog"
description="wap-blog Application"
command="/opt/wap-blog/wap-server-linux"
directory="/opt/wap-blog"
command_background=true
pidfile="/run/${RC_SVCNAME}.pid"
command_user="root:root"
retry="3"
depend() {
# 最通用且安全的依赖:网络就绪后启动
after net-online
# 确保本地文件系统(如/opt/wap-blog)已挂载
after localmount
}
start_pre() {
# 检查应用程序是否存在
if [ ! -f "/opt/wap-blog/wap-server-linux" ]; then
eerror "应用程序 /opt/wap-blog/wap-server-linux 不存在"
return 1
fi
# 检查是否有执行权限
if [ ! -x "/opt/wap-blog/wap-server-linux" ]; then
eerror "应用程序没有执行权限"
return 1
fi
# 创建必要的运行目录
checkpath -d /run
checkpath -d /var/log/wap-blog
einfo "wap-blog服务启动前检查完成"
return 0
}
start_post() {
# 等待2秒让服务启动
sleep 2
# 检查进程是否运行
if [ -f "/run/${RC_SVCNAME}.pid" ]; then
local pid=$(cat "/run/${RC_SVCNAME}.pid")
if kill -0 "$pid" 2>/dev/null; then
einfo "wap-blog服务已成功启动 (PID: $pid)"
return 0
fi
fi
ewarn "服务可能启动异常,请检查日志"
return 0
}
stop_post() {
# 清理PID文件
if [ -f "/run/${RC_SVCNAME}.pid" ]; then
rm -f "/run/${RC_SVCNAME}.pid"
fi
# 可选:清理其他临时文件
# rm -f /tmp/wap-blog.*
einfo "wap-blog服务已完全停止"
return 0
}
EOF
bash
cat > /etc/conf.d/wap-blog << 'EOF'
# wap-blog服务配置
# 启动参数,根据你的应用需要修改
WAP_BLOG_ARGS="--port 8080 --log-file /var/log/wap-blog/app.log"
# 环境变量
export WAP_BLOG_ENV="production"
export WAP_BLOG_DATA_DIR="/var/lib/wap-blog"
# Java应用可能需要(如果是Java应用)
# export JAVA_HOME="/usr/lib/jvm/java-11-openjdk"
# export JAVA_OPTS="-Xms256m -Xmx512m"
EOF
bash
# 创建应用目录(如果不存在)
mkdir -p /opt/wap-blog
mkdir -p /var/log/wap-blog
mkdir -p /var/lib/wap-blog
# 确保你的应用文件在正确位置
# 假设你的应用文件已经上传到/opt/wap-blog/wap-server-linux
# 如果没有,你需要复制或下载它
# 给应用执行权限
chmod +x /opt/wap-blog/wap-server-linux
bash
# 创建服务脚本(使用上面的cat命令)
cat > /etc/init.d/wap-blog << 'EOF'
#!/sbin/openrc-run
name="wap-blog"
description="wap-blog Application"
command="/opt/wap-blog/wap-server-linux"
directory="/opt/wap-blog"
command_background=true
pidfile="/run/${RC_SVCNAME}.pid"
command_user="root:root"
retry="3"
depend() {
after net-online
after localmount
}
start_pre() {
if [ ! -f "/opt/wap-blog/wap-server-linux" ]; then
eerror "应用程序 /opt/wap-blog/wap-server-linux 不存在"
return 1
fi
if [ ! -x "/opt/wap-blog/wap-server-linux" ]; then
eerror "应用程序没有执行权限"
return 1
fi
checkpath -d /run
checkpath -d /var/log/wap-blog
einfo "wap-blog服务启动前检查完成"
return 0
}
start_post() {
sleep 2
if [ -f "/run/${RC_SVCNAME}.pid" ]; then
local pid=$(cat "/run/${RC_SVCNAME}.pid")
if kill -0 "$pid" 2>/dev/null; then
einfo "wap-blog服务已成功启动 (PID: $pid)"
return 0
fi
fi
ewarn "服务可能启动异常,请检查日志"
return 0
}
EOF
# 给服务脚本执行权限
chmod +x /etc/init.d/wap-blog
# 创建配置文件(如果需要)
cat > /etc/conf.d/wap-blog << 'EOF'
# wap-blog服务配置
# 启动参数,根据你的应用需要修改
# WAP_BLOG_ARGS="--port 8080 --log-file /var/log/wap-blog/app.log"
EOF
bash
# 1. 检查脚本语法
bash -n /etc/init.d/wap-blog
# 2. 查看服务描述
/etc/init.d/wap-blog describe
# 3. 测试启动(实际启动应用)
rc-service wap-blog start
# 4. 检查状态
rc-service wap-blog status
# 5. 查看服务是否在运行
ps aux | grep wap-server-linux
# 6. 查看日志(如果应用有输出)
tail -f /var/log/wap-blog/app.log 2>/dev/null || echo "日志文件不存在,检查应用配置"
# 7. 测试停止
rc-service wap-blog stop
# 8. 确认进程已停止
sleep 1
ps aux | grep wap-server-linux | grep -v grep && echo "进程仍在运行" || echo "进程已停止"
bash
# 将服务添加到默认运行级别
rc-update add wap-blog default
# 查看是否添加成功
rc-update show | grep wap-blog
# 查看详细的服务列表
rc-status -a
# 测试启动级别(模拟启动过程但不重启)
openrc default
# 或者手动启动所有默认服务
openrc boot
bash
# 查看当前服务状态
rc-service wap-blog status
# 重启服务
rc-service wap-blog restart
# 查看OpenRC日志
tail -20 /var/log/rc.log 2>/dev/null || dmesg | tail -20
# 最终测试:重启系统
echo "要测试开机自启,请重启系统:"
echo "reboot"
# 重启后检查服务
echo "重启后使用以下命令检查:"
echo "rc-service wap-blog status"
echo "rc-status | grep wap-blog"
生产包完整脚本
GOOS=linux GOARCH=amd64 go build -trimpath -ldflags="-s -w" -o server_linux cmd/server/main.go && ls -lh server_linux
/opt/wap-blog/wap-server-linux 确实存在且有执行权限net-online 可能需要 networking 服务支持,在Alpine中通常已包含如果你的应用需要额外的环境变量或特定参数,可以修改 /etc/conf.d/wap-blog 文件,然后在服务脚本中通过 command_args="${WAP_BLOG_ARGS}" 引用。