在 CentOS 中,spool 目录无法写入通常不是“spool 本身”的问题,而是权限、SELinux、文件系统状态或路径不存在导致的。下面按最常见原因逐一说明,并给出排查方法。
不同服务对应的 spool 目录不同:
/var/spool/mail/:用户邮件/var/spool/cron/:cron 任务/var/spool/postfix/:Postfix 邮件队列/var/spool/cups/:打印队列/var/spool/at/:at 任务ls -ld /var/spool/xxx
正常情况示例:
drwxr-xr-x root root
或特定服务用户(如 postfix、cron)
✅ 解决:
chown -R 正确用户:正确组 /var/spool/xxx
chmod 755 /var/spool/xxx
例如:
chown root:crontab /var/spool/cron
chmod 1730 /var/spool/cron
即使权限是对的,SELinux 也可能拦截。
检查:
getenforce
如果是 Enforcing,继续:
查看拒绝记录:
ausearch -m avc -ts recent
✅ 临时验证:
setenforce 0
如果此时能写,说明是 SELinux 问题。
✅ 正确做法(不建议直接关 SELinux):
restorecon -Rv /var/spool/xxx
或修复上下文:
semanage fcontext -a -t var_spool_t "/var/spool/xxx(/.*)?"
restorecon -Rv /var/spool/xxx
mount | grep " / "
如果看到 ro,说明系统进入了只读模式(常见于磁盘错误)。
✅ 解决:
mount -o remount,rw /
并检查磁盘:
dmesg | grep error
fsck -y /dev/xxx
有些程序不会自动创建 spool 目录。
ls /var/spool/xxx
✅ 创建:
mkdir -p /var/spool/xxx
chown 正确用户:正确组 /var/spool/xxx
df -h
df -i
✅ 清理日志或临时文件:
journalctl --vacuum-size=100M
例如 cron、postfix:
systemctl status crond
systemctl status postfix
ls -ld /var/spool/xxx
getenforce
mount | grep " / "
df -h
df -i
ausearch -m avc -ts recent
我可以直接给你对应的一条命令解决方案。