8.2.7 启动脚本与服务化管理

在生产环境中,Redis需要具备可控、可审计、可恢复的启动与停止流程,建议统一采用服务化管理。systemd 方式可将运行参数、工作目录、权限与日志输出纳入服务定义,避免手工启动造成的配置漂移与进程孤儿。

文章图片

启动脚本与参数管理要点:
- 统一指定配置文件路径(如/etc/redis/redis.conf),禁止命令行临时覆盖关键参数。
- 显式设置dirpidfilelogfiledaemonizesupervised参数,确保进程可控。
- 使用专用用户(如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
# 预期:检测可用内存,若配置异常需修正

练习题#

  1. 将 Redis 服务加入 systemd 并设置 Restart=on-failure,验证服务异常退出后自动拉起。
  2. 修改 pidfilelogfile 路径,观察 systemd 状态和日志输出是否正确更新。
  3. 使用脚本方式启动 Redis,模拟端口占用并给出排查步骤与修复方案。