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
注意事项
- 配置文件位置:
/etc/init/
目录下,以.conf
结尾 - 权限设置: 配置文件通常为
644
权限 - 重载配置: 修改后需要
reload-configuration
- 日志位置: 默认在
/var/log/upstart/
目录 - 依赖服务: 确保依赖的服务也有对应的 Upstart 配置