排查开机启动项未执行需分三步:一查配置是否生效(如systemctl is-enabled、rc-local状态等);二验执行环境(绝对路径、依赖服务、用户权限、显式环境变量);三查日志定位失败原因(journalctl -u 服务名 -b等)。

排查开机启动项未执行,关键不是“有没有配”,而是“配了但为什么没跑”。要分三步走:确认配置是否生效、验证执行环境是否就绪、检查运行时是否失败。
一、确认服务或脚本是否真被系统识别为开机启动
很多人以为写了脚本、加了enable就完事,其实第一步必须验证系统是否真的“记住了”这个启动项。
- 查 systemd 服务是否启用:
systemctl is-enabled 服务名(如systemctl is-enabled nginx),返回enabled才算成功注册 - 查所有已启用的服务:
systemctl list-unit-files --type=service | grep enabled,确认目标服务在列表中 - 若用
/etc/rc.local,先确认它是否被 systemd 激活:systemctl status rc-local;再检查文件是否可执行:ls -l /etc/rc.local(需有x权限) - 若用 SysVinit 风格(如 CentOS 7 兼容模式),运行
chkconfig --list | grep 服务名或ls /etc/rc3.d/ | grep S
二、验证启动时的执行环境是否满足
脚本或服务在手动运行时正常,但开机不执行,90% 是因为启动阶段缺少必要条件。
- 路径必须全用绝对路径:
ExecStart=/usr/bin/python3 /home/user/app/start.py,不能写python start.py或./start.py - 确保依赖服务已就绪:比如你的脚本要连数据库,就得在
[Unit]段加After=mysqld.service和Wants=mysqld.service - 用户与权限要明确:systemd 默认以 root 运行,若需普通用户,请在
[Service]中指定User=user和Group=user,并确保该用户家目录、shell、环境变量可用 - 环境变量不继承:systemd 不加载
/etc/profile或~/.bashrc,需在 service 文件中用Environment=PATH=/usr/local/bin:/usr/bin显式声明
三、检查运行日志,定位真实失败原因
很多问题不会报错到屏幕,但一定留在日志里。别猜,直接看。
- 查服务启动全过程:
systemctl status 服务名(重点关注Loaded行是否显示enabled,以及Active状态是否为failed或inactive) - 看详细启动日志:
journalctl -u 服务名 -b(-b表示本次启动),从第一条开始读,注意Failed to start、Permission denied、No such file or directory等关键词 - 若用
rc.local,日志默认输出到/var/log/messages或通过journalctl -u rc-local -b查看 - 临时加调试输出:在脚本开头加入
echo "$(date): script started" >> /tmp/boot_debug.log 2>&1,重启后检查该文件是否存在、是否有时间戳











