Redis 报错 “CONFIG REWRITE failed: Permission denied”
无意中看到了redis的config rewrite这个命令。闲来无聊,所以打算自己做个实验。下面的文章是redis关于config rewrite的描述信息:
CONFIG REWRITE 命令对启动 Redis 服务器时所指定的 redis.conf 文件进行改写: 因为 CONFIG SET 命令可以对服务器的当前配置进行修改, 而修改后的配置可能和 redis.conf 文件中所描述的配置不一样, CONFIG REWRITE 的作用就是通过尽可能少的修改, 将服务器当前所使用的配置记录到 redis.conf 文件中。
重写会以非常保守的方式进行:
原有 redis.conf 文件的整体结构和注释会被尽可能地保留。
如果一个选项已经存在于原有 redis.conf 文件中 , 那么对该选项的重写会在选项原本所在的位置(行号)上进行。
如果一个选项不存在于原有 redis.conf 文件中, 并且该选项被设置为默认值, 那么重写程序不会将这个选项添加到重写后的 redis.conf 文件中。
如果一个选项不存在于原有 redis.conf 文件中, 并且该选项被设置为非默认值, 那么这个选项将被添加到重写后的 redis.conf 文件的末尾。
未使用的行会被留白。 比如说, 如果你在原有 redis.conf 文件上设置了数个关于 save 选项的参数, 但现在你将这些 save 参数的一个或全部都关闭了, 那么这些不再使用的参数原本所在的行就会变成空白的。
即使启动服务器时所指定的 redis.conf 文件已经不再存在, CONFIG REWRITE 命令也可以重新构建并生成出一个新的 redis.conf 文件。
另一方面, 如果启动服务器时没有载入 redis.conf 文件, 那么执行 CONFIG REWRITE 命令将引发一个错误。
在上面redis的描述中,我们在线更改redis.conf配置文件的时候,执行config rewrite将在线更改的redis.conf配置同步应用到读取的配置文件中。
实验步骤:
1.config get maxclients
2.config set maxclients "100000"
3.config rewrite
ERR CONFIG REWRITE failed: Permission denied
发现执行config rewrite命令错误,一开始的时候怀疑是因为权限的原因。
https://github.com/arioch/puppet-redis/commit/09f52cfda45ecd04f42b05f1b37b1e3a36154cd5
执行更改权限的命令:
chown redis:redis /etc/redis.conf
更改权限之后,继续在线执行config rewrite,发现还是不行,然后再redis的官方文档查看这个config rewrite这个命令信息,可以得到:
CONFIG REWRITE is also able to rewrite the configuration file from scratch if the original one no longer exists for some reason. However if the server was started without a configuration file at all, the CONFIG REWRITE will just return an error.
https://redis.io/commands/config-rewrite
上述描述可以比较明显的得到就是redis 启动的没有指定配置文件的时候,执行这个命令是会报错的。所以只有在启动redis的时候指定redis.conf之后才能执行这个命令。
下面关于Redis的文章您也可能喜欢,不妨参考下: