You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 04:53:23