Ubuntu 20.04中rc.local无法生效执行chown脚本的问题求助
看起来你已经做了不少尝试,但文件夹权限还是没按预期修改,咱们一步步排查可能的问题:
首先,先看你提供的/etc/systemd/system/rc-local.service文件,里面有明显的粘贴错误——最后部分重复了[Unit]和[Service]的开头,而且WantedBy字段也没写完(变成了multi-user.targ[Unit]),这会导致systemd无法正确识别服务配置,大概率是核心问题之一!
第一步:修复rc-local.service配置文件
把你的/etc/systemd/system/rc-local.service替换成完整正确的内容:
[Unit] Description=/etc/rc.local Compatibility ConditionPathExists=/etc/rc.local [Service] Type=forking ExecStart=/etc/rc.local start TimeoutSec=0 StandardOutput=tty RemainAfterExit=yes SysVStartPriority=99 [Install] WantedBy=multi-user.target
然后重新加载systemd配置并重启服务:
sudo systemctl daemon-reload sudo systemctl restart rc-local.service
第二步:确认脚本和权限细节
- 确保你的
/opt/chownscript.sh有执行权限:
sudo chmod +x /opt/chownscript.sh
虽然你用sh调用脚本不需要执行权限,但保证权限正确能避免潜在的环境问题。
2. 把脚本里的chown改成绝对路径,避免系统环境变量差异导致命令找不到:
#!/bin/bash /usr/bin/chown -R 1001:1001 /opt/redis exit 0
第三步:检查执行时机冲突
从systemctl日志看,rc-local已经成功执行了chown命令,但权限没变化,还有一种常见可能是redis服务在rc.local之后启动——如果redis启动时会重新生成文件或重置权限,那你之前的chown操作就被覆盖了。
这种情况下,更可靠的做法是直接在redis的systemd服务里添加前置操作:
- 找到redis的服务文件(通常是
/etc/systemd/system/redis.service或/lib/systemd/system/redis.service) - 在
[Service]部分添加一行:
ExecStartPre=/usr/bin/chown -R 1001:1001 /opt/redis
- 重新加载配置并重启redis:
sudo systemctl daemon-reload sudo systemctl restart redis.service
这样每次redis启动前都会自动修改权限,比依赖rc.local更稳妥。
另外,注意到你的systemctl日志里有sudo执行chown的记录,但你提供的脚本里并没有sudo——如果你的实际脚本里加了sudo,其实完全没必要,因为rc.local本身就是以root权限执行的,多余的sudo反而可能引入不必要的问题,建议脚本里直接用chown命令即可。
备注:内容来源于stack exchange,提问作者ezzys

