使用sudo执行Logrotate仍提示Permission Denied的原因排查
使用sudo执行Logrotate仍提示Permission Denied的原因排查
我来帮你拆解这个权限问题的核心原因——问题出在你logrotate配置里的**su www-data www-data**这一行!
你可能会疑惑:我明明用sudo启动了logrotate,进程应该是root权限啊?没错,logrotate确实是以root身份启动的,但su指令会强制logrotate切换到www-data用户去执行实际的日志重命名、轮转操作,这才是权限拒绝的根源。
具体分析
- 目录权限≠文件权限:虽然
/var/log目录是root所有且给了组读写权限,但单个日志文件/var/log/myapp-stdout.log的所有者可能是root或者其他用户,www-data没有修改/重命名它的权限。 - 用户组限制:
/var/log的组是syslog,而www-data默认不在这个组里,它作为其他用户只有目录的读和执行权限,没有写入权限——而重命名文件需要目录的写入权限。
排查与验证步骤
- 先检查目标日志文件的权限:
看看文件的所有者和组是不是ls -lah /var/log/myapp-stdout.logwww-data,如果是其他用户,那www-data自然没权限操作它。 - 临时注释掉配置里的
su www-data www-data行,再执行一次测试:
如果这次能成功轮转,就完全确认是sudo logrotate /etc/logrotate.d/myconf --verbose -fsu配置导致的权限问题。
解决办法
- 如果业务确实需要用
www-data执行轮转:- 把目标日志文件的所有者改成
www-data:sudo chown www-data:www-data /var/log/myapp-stdout.log - 或者把
www-data加入syslog组:sudo usermod -aG syslog www-data(需要重启logrotate或相关进程生效)
- 把目标日志文件的所有者改成
- 如果不需要切换用户,直接删除配置里的
su www-data www-data行即可——毕竟sudo已经以root身份运行,足够完成日志轮转操作。
备注:内容来源于stack exchange,提问作者Cerin
相关产品推荐
相关产品推荐

