kaisawind's blog
  • 关于
  • 所有帖子

upstart的服务配置写法 - Tue, Sep 2, 2025

upstart的服务配置写法

Upstart 配置文件结构

基本语法

# 注释以井号开头
指令 参数
指令 "带空格的参数"

# 节段脚本
script
    # 多行脚本
    command1
    command2
end script

主要指令说明

1. 元数据指令

# 服务描述
description "i2 service"

# 作者信息(可选)
author "Your Name <email@example.com>"

# 服务版本(可选)
version "1.0"

2. 启动条件指令

# 基本启动条件
start on runlevel [2345]                  # 在运行级别2-5启动
start on started networking              # 网络启动后启动
start on (local-filesystems and net-device-up IFACE=eth0)  # 组合条件

# 停止条件
stop on runlevel [016]                   # 在运行级别0,1,6停止
stop on stopping networking             # 网络停止时停止

# 复杂条件组合
start on (filesystem and started dbus and started sshd)

3. 依赖关系管理

# 依赖其他服务
start on started i2-server               # i2-server启动后启动
stop on stopping i2-server              # i2-server停止时停止

# 确保服务启动顺序
start on (started i2-server and runlevel [2345])

4. 进程管理指令

# 自动重启配置
respawn                                  # 进程退出时自动重启
respawn limit 10 5                      # 10次内最多重启5次
respawn limit unlimited                 # 无限制重启

# 执行命令
exec /usr/sbin/i2 --daemon              # 直接执行命令
exec su - user -c "/path/to/command"    # 以特定用户执行

# 或者使用script块
script
    export PATH=/usr/local/bin:$PATH
    exec /usr/sbin/i2
end script

5. 环境变量

# 设置环境变量
env DAEMON=/usr/sbin/i2
env PIDFILE=/var/run/i2.pid
env USER=www-data
env GROUP=www-data
env OPTIONS="--verbose --logfile=/var/log/i2.log"

# 使用环境变量
exec $DAEMON $OPTIONS

6. 生命周期脚本

# 启动前执行
pre-start script
    # 检查依赖服务
    if ! pgrep -f i2-server > /dev/null; then
        logger "i2-server not running"
        exit 1
    fi
    # 创建必要的目录
    mkdir -p /var/run/i2
    chown $USER:$GROUP /var/run/i2
end script

# 启动后执行
post-start script
    # 等待进程真正启动
    sleep 2
    # 检查进程状态
    if ! pgrep -f i2 > /dev/null; then
        logger "i2 failed to start"
        exit 1
    fi
end script

# 停止前执行
pre-stop script
    # 优雅停止前的清理
    logger "Stopping i2 service"
end script

# 停止后执行
post-stop script
    # 清理工作
    rm -f $PIDFILE 2>/dev/null || true
    logger "i2 service stopped"
end script

7. 实例管理

# 多实例支持
instance $JOB-$INDEX                    # 创建实例标识

# 或者固定实例名
instance i2-worker

8. 日志配置

# 控制台输出
console output                         # 输出到控制台
console log                           # 输出到日志文件
console none                          # 不输出

# 标准输出重定向
exec >> /var/log/i2.log 2>&1          # 重定向到文件

完整的配置示例

基础版本

description "i2 service"
author "Admin <admin@example.com>"

# 启动条件
start on (started i2-server and runlevel [2345])
stop on (stopping i2-server or runlevel [016])

# 自动重启
respawn
respawn limit 10 60

# 环境变量
env DAEMON=/usr/sbin/i2
env USER=www-data
env OPTIONS="--config=/etc/i2.conf"

# 执行命令
exec start-stop-daemon --start --chuid $USER --exec $DAEMON -- $OPTIONS

# 日志配置
console log

高级版本

description "Advanced i2 service with full management"
author "Admin <admin@example.com>"
version "1.1"

# 启动停止条件
start on (started i2-server and filesystem and net-device-up IFACE!=lo)
stop on (stopping i2-server or runlevel [016])

# 重启策略
respawn
respawn limit 5 300                    # 5次内最多重启,300秒窗口
respawn retry 3                        # 失败后重试3次

# 环境配置
env DAEMON=/usr/sbin/i2
env PIDFILE=/var/run/i2.pid
env USER=www-data
env GROUP=www-data
env LOGFILE=/var/log/i2.log
env CONFIG_FILE=/etc/i2/config.conf

# 启动前准备
pre-start script
    # 检查依赖服务
    if ! pgrep -f i2-server > /dev/null; then
        logger -t i2 "ERROR: i2-server is not running"
        exit 1
    fi
    
    # 创建必要的目录
    mkdir -p $(dirname $PIDFILE) $(dirname $LOGFILE)
    chown $USER:$GROUP $(dirname $PIDFILE) $(dirname $LOGFILE)
    
    # 检查配置文件
    if [ ! -f $CONFIG_FILE ]; then
        logger -t i2 "ERROR: Config file $CONFIG_FILE not found"
        exit 1
    fi
    
    logger -t i2 "Starting i2 service"
end script

# 主进程执行
script
    export HOME=/home/$USER
    export PATH=/usr/local/bin:$PATH
    exec start-stop-daemon --start --make-pidfile --pidfile $PIDFILE \
         --chuid $USER:$GROUP --exec $DAEMON -- \
         --config $CONFIG_FILE \
         --logfile $LOGFILE \
         --daemon
end script

# 启动后验证
post-start script
    # 等待进程启动
    sleep 1
    
    # 检查进程是否运行
    if [ ! -f $PIDFILE ] || ! kill -0 $(cat $PIDFILE) 2>/dev/null; then
        logger -t i2 "ERROR: Process failed to start"
        exit 1
    fi
    
    logger -t i2 "Service started successfully (PID: $(cat $PIDFILE))"
end script

# 停止前处理
pre-stop script
    logger -t i2 "Stopping i2 service"
    
    # 发送优雅停止信号
    if [ -f $PIDFILE ] && kill -0 $(cat $PIDFILE) 2>/dev/null; then
        kill -TERM $(cat $PIDFILE)
        sleep 2
    fi
end script

# 停止后清理
post-stop script
    # 清理PID文件
    rm -f $PIDFILE 2>/dev/null || true
    
    # 日志轮转或其他清理
    if [ -f $LOGFILE ] && [ $(stat -c %s $LOGFILE 2>/dev/null) -gt 10485760 ]; then
        mv $LOGFILE $LOGFILE.old
    fi
    
    logger -t i2 "Service stopped completely"
end script

# 日志配置
console log

常用管理命令

# 启动服务
sudo start i2

# 停止服务
sudo stop i2

# 重启服务
sudo restart i2

# 查看状态
sudo status i2

# 查看配置
sudo initctl show-config i2

# 查看日志
sudo tail -f /var/log/upstart/i2.log

# 重新加载配置
sudo initctl reload-configuration

# 列出所有服务
sudo initctl list

# 查看事件日志
sudo initctl log-priority

调试技巧

# 测试配置文件语法
init-checkconf /etc/init/i2.conf

# 手动触发事件测试
sudo initctl emit started i2-server

# 查看详细状态信息
sudo initctl status i2 --verbose

# 在前台运行测试
sudo initctl start i2 --verbose

注意事项

  1. 配置文件位置: /etc/init/ 目录下,以 .conf 结尾
  2. 权限设置: 配置文件通常为 644 权限
  3. 重载配置: 修改后需要 reload-configuration
  4. 日志位置: 默认在 /var/log/upstart/ 目录
  5. 依赖服务: 确保依赖的服务也有对应的 Upstart 配置


辽ICP备2021007608号 | © 2025 | kaisawind

Facebook Twitter GitHub