SELinux环境下systemd运行MySQL监控Bash脚本失败求助
问题分析与解决方案
错误码203/EXEC的本质
systemd返回的203/EXEC错误,核心是无法执行指定的脚本/程序。既然你手动运行脚本完全正常,排除了权限、shebang错误这类基础问题,结合SELinux环境,大概率是SELinux的强制访问控制(MAC)阻止了systemd进程执行脚本。
SELinux触发问题的原因
SELinux通过安全上下文(security context)管控文件访问:
- 你把脚本放在
/home/user/下,这个目录的默认SELinux上下文是user_home_t,属于用户个人文件范畴。 - systemd服务进程运行时的上下文属于系统级(比如
system_u:object_r:systemd_unit_file_t:s0),SELinux默认规则不允许系统进程执行user_home_t类型的文件,哪怕Linux的DAC权限(chmod)已经开放了执行权限。
验证与解决步骤
1. 先确认是否为SELinux导致
临时切换SELinux到宽容模式,验证问题:
setenforce 0
然后重新加载并启动服务:
systemctl daemon-reload systemctl start trial_monitor.service
如果服务能正常启动,坐实是SELinux的问题,再执行setenforce 1恢复强制模式,继续后续配置。
2. 修复SELinux上下文的两种方案
方案一:迁移脚本到系统允许的目录
把脚本移到/usr/local/bin/这类系统默认允许执行的目录(该目录的SELinux上下文是bin_t,适配系统进程执行):
mv /home/user/trigger_systemd/check_db1.bash /usr/local/bin/
然后修改/etc/systemd/system/trial_monitor.service里的ExecStart路径为新的位置,再重启服务:
systemctl daemon-reload systemctl restart trial_monitor.service
方案二:修改脚本的SELinux上下文(不移动脚本)
如果不想迁移脚本,先临时修改上下文测试:
chcon -t bin_t /home/user/trigger_systemd/check_db1.bash
测试成功后,用以下命令永久生效(避免重启或restorecon重置):
semanage fcontext -a -t bin_t "/home/user/trigger_systemd/check_db1.bash" restorecon -v /home/user/trigger_systemd/check_db1.bash
3. 最后检查服务文件配置
确保trial_monitor.service的ExecStart路径绝对正确,脚本首行的shebang是#!/bin/bash(确认/bin/bash存在),如果服务指定了User,要确保该用户对脚本有读取和执行权限。
示例服务文件参考:
[Unit] Description=MySQL Table Update Monitor [Service] ExecStart=/usr/local/bin/check_db1.bash Restart=always # 如果用普通用户运行,需确保该用户能访问脚本和MySQL # User=your_username [Install] WantedBy=multi-user.target
内容的提问来源于stack exchange,提问作者Troy Chan
相关产品推荐
相关产品推荐

