几个月来,我一直在运行从源代码构建的 redis,但今天我切换到使用包管理器(在 Debian 上运行)。它运行良好,直到我将工作目录更改为/home/redis/server
。现在,当使用 将其作为服务启动时sudo service redis-server start
,我收到一个错误,并且以下内容添加到 redis 日志中:
Can't chdir to '/home/redis/server': Permission denied
getfacl
在 redis 目录上递归运行返回
# file: .
# owner: redis
# group: redis
user::rwx
group::rwx
other::rwx
# file: server
# owner: redis
# group: redis
user::rwx
group::rwx
other::rwx
# file: server/dump.rdb
# owner: redis
# group: redis
user::rwx
group::rwx
other::rwx
如果我su
使用 redis 并手动运行它/usr/bin/redis-server /etc/redis/redis.conf
,它可以正常工作,所以它只会在尝试使用包含的 init.d 脚本时发生。
答案1
事实证明,Redis 附带的 init 脚本实际上并未使用,而是使用了/etc/systemd/system/redis.service
。此文件中有许多安全限制,包括ProtectHome=yes
限制可写入的目录。我已修改此文件以注释掉ProtectHome=yes
并添加一行ReadWriteDirectories=-/home/redis/server
,现在它可以正常工作。
此后,运行systemctl daemon-reload
以在运行之前重新加载更改service start redis-server
。
答案2
您应该确保 redis 服务是由 init.d 使用 redis 用户上下文启动的。
编辑/etc/init.d/redis-server
和添加
--chuid redis:redis
在哪里start-stop-daemon
调用。由于su
redis 正在运行,这应该可以修复错误。