status=203/exec错误在路径、权限、解释器均正确时,极可能由selinux强制模式拦截导致;需用getenforce/sestatus确认状态,ls -z检查上下文,setenforce 0临时验证,并通过ausearch+audit2why定位拒绝原因,最后用semanage fcontext+restorecon或audit2allow永久修复。

当 systemd 服务报 status=203/EXEC,且已确认路径、权限、解释器都正确时,SELinux 很可能就是“隐形拦路虎”。它不会直接报错“SELinux 拦截”,而是让进程在 execve() 阶段静默失败——这正是 203 错误的典型特征。
确认 SELinux 是否处于 Enforcing 模式
先验证问题是否存在:
- 运行
getenforce—— 若输出为 Enforcing,说明 SELinux 正在主动执行策略 - 运行
sestatus查看详细状态,重点关注 Current mode 和 Mode from config file - 注意:即使
getenforce返回 Permissive,也要检查配置文件(/etc/selinux/config)是否设为 enforcing,因为重启后会生效
检查服务文件和执行目标的 SELinux 上下文
SELinux 要求可执行文件、脚本、目录都有匹配的安全上下文。常用命令:
- 查看服务单元文件的上下文:
ls -Z /etc/systemd/system/myapp.service—— 正常应为system_u:object_r:systemd_unit_file_t:s0 - 查看启动脚本或二进制的上下文:
ls -Z /opt/myapp/start.sh—— 常见错误是显示unconfined_u:object_r:user_home_t:s0或类似非标准类型 - 若上下文异常(如
default_t、user_home_t),说明未被正确标记,systemd 无法以受限域启动它
快速验证是否为 SELinux 拦截
不关闭防护,仅临时切换模式观察行为:
- 执行
sudo setenforce 0(切换为 Permissive 模式) - 再次运行
sudo systemctl start myapp—— 若此时成功,基本可锁定 SELinux 是根源 - 立即执行
sudo ausearch -m avc -ts recent | audit2why,查看最近的拒绝记录及修复建议 - 完成后记得
sudo setenforce 1恢复强制模式
永久修复:打标签或生成策略
根据实际场景选择安全、可持续的方案:
- 对脚本/二进制打标准上下文:
sudo semanage fcontext -a -t bin_t "/opt/myapp/start\.sh",再运行sudo restorecon -v /opt/myapp/start.sh - 若服务需访问网络、日志、数据库等资源,可能需要自定义策略:
sudo ausearch -m avc -ts recent | audit2allow -M myapp,然后sudo semodule -i myapp.pp - 避免使用
container_runtime_exec_t或httpd_exec_t等专用类型来标记自定义服务,除非明确符合其语义;优先用bin_t、usr_t或新建类型











