8.2.7 启动脚本与服务化管理
在生产环境中,Redis需要具备可控、可审计、可恢复的启动与停止流程,建议统一采用服务化管理。systemd 方式可将运行参数、工作目录、权限与日志输出纳入服务定义,避免手工启动造成的配置漂移与进程孤儿。
启动脚本与参数管理要点:
- 统一指定配置文件路径(如/etc/redis/redis.conf),禁止命令行临时覆盖关键参数。
- 显式设置dir、pidfile、logfile、daemonize与supervised参数,确保进程可控。
- 使用专用用户(如redis)运行,配合最小权限目录规划。
- 启动前校验配置语法,避免错误参数导致启动失败。
systemd 服务化示例(完整可执行)#
1)准备用户与目录
sudo useradd -r -s /sbin/nologin redis
sudo mkdir -p /etc/redis /var/lib/redis /var/log/redis /var/run/redis
sudo chown -R redis:redis /var/lib/redis /var/log/redis /var/run/redis
2)关键配置示例 /etc/redis/redis.conf
bind 0.0.0.0
port 6379
dir /var/lib/redis
pidfile /var/run/redis/redis_6379.pid
logfile /var/log/redis/redis.log
daemonize no
supervised systemd
requirepass "StrongPassw0rd"
appendonly yes
3)systemd 单元文件 /etc/systemd/system/redis.service
[Unit]
Description=Redis In-Memory Data Store
After=network.target
[Service]
Type=notify
User=redis
Group=redis
ExecStart=/usr/local/bin/redis-server /etc/redis/redis.conf
ExecStop=/usr/local/bin/redis-cli -a StrongPassw0rd shutdown
PIDFile=/var/run/redis/redis_6379.pid
Restart=on-failure
LimitNOFILE=65535
[Install]
WantedBy=multi-user.target
4)启动与验证
sudo systemctl daemon-reload
sudo systemctl enable --now redis
# 预期:active (running)
systemctl status redis
# 预期:PONG
redis-cli -a StrongPassw0rd ping
自定义启动脚本示例(适用于二进制/源码安装)#
脚本路径:/usr/local/bin/redisctl
#!/bin/bash
REDIS_BIN="/usr/local/bin/redis-server"
CONF="/etc/redis/redis.conf"
PID="/var/run/redis/redis_6379.pid"
start() {
if [ -f "$PID" ] && kill -0 $(cat "$PID") 2>/dev/null; then
echo "Redis already running."
return 0
fi
$REDIS_BIN $CONF
sleep 1
echo "Started, pid=$(cat $PID)"
}
stop() {
if [ -f "$PID" ]; then
/usr/local/bin/redis-cli -a StrongPassw0rd shutdown
sleep 1
echo "Stopped."
else
echo "No PID file."
fi
}
status() {
if [ -f "$PID" ] && kill -0 $(cat "$PID") 2>/dev/null; then
echo "Redis running, pid=$(cat $PID)"
else
echo "Redis not running"
fi
}
case "$1" in
start|stop|status) $1 ;;
restart) stop; start ;;
*) echo "Usage: $0 {start|stop|status|restart}" ;;
esac
使用方法
chmod +x /usr/local/bin/redisctl
redisctl start
redisctl status
常见排错与定位(带命令与预期)#
1)启动失败:端口被占用
ss -lntp | grep 6379
# 预期:无输出或确认占用进程
2)PID 文件冲突
cat /var/run/redis/redis_6379.pid
ps -fp $(cat /var/run/redis/redis_6379.pid)
# 若进程不存在,删除 PID 文件后再启动
3)权限问题
ls -ld /var/lib/redis /var/log/redis /var/run/redis
# 预期:redis:redis
4)配置语法检查
redis-server /etc/redis/redis.conf --test-memory 10
# 预期:检测可用内存,若配置异常需修正
练习题#
- 将 Redis 服务加入 systemd 并设置
Restart=on-failure,验证服务异常退出后自动拉起。 - 修改
pidfile与logfile路径,观察 systemd 状态和日志输出是否正确更新。 - 使用脚本方式启动 Redis,模拟端口占用并给出排查步骤与修复方案。