王可可的主页

不止于CRUD

Alpine Linux 服务的开机自启配置指南

📅 2026-01-22 📂 技术类 👁️ 31 阅读
← 返回列表
摘要: 在 Alpine Linux 中使用原生 OpenRC 为应用配置开机自启,核心流程是:在 /etc/init.d/ 创建服务脚本,确保应用文件有执行权限,最后通过 rc-update add <服务名> default 命令将其加入默认启动级别。

📁 创建OpenRC服务脚本

1. 创建wap-blog服务脚本

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

2. 创建配置文件(可选)

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

🔧 完整的配置流程命令

步骤1:创建服务目录和放置应用

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

步骤2:创建服务脚本并设置权限

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

步骤3:测试服务脚本

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 "进程已停止"

步骤4:加入开机自启动

bash

# 将服务添加到默认运行级别
rc-update add wap-blog default

# 查看是否添加成功
rc-update show | grep wap-blog

# 查看详细的服务列表
rc-status -a

# 测试启动级别(模拟启动过程但不重启)
openrc default

# 或者手动启动所有默认服务
openrc boot

步骤5:验证和测试重启

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

⚠️ 重要提醒

  1. 应用路径验证:确保 /opt/wap-blog/wap-server-linux 确实存在且有执行权限
  2. 网络依赖net-online 可能需要 networking 服务支持,在Alpine中通常已包含
  3. 端口冲突:如果你的应用使用特定端口(如8080),确保端口未被占用
  4. 日志管理:建议应用内部实现日志轮转,或配置logrotate
  5. 测试顺序:先测试手动启动,再测试重启,最后测试系统重启

如果你的应用需要额外的环境变量或特定参数,可以修改 /etc/conf.d/wap-blog 文件,然后在服务脚本中通过 command_args="${WAP_BLOG_ARGS}" 引用。