如何在Linux CentOS 7开机时运行Python守护进程?rc.local配置无效
我来帮你排查这个问题——这种情况我在日常运维中碰到过不少,大多是权限、路径或者环境变量的问题导致的,咱们一步步来解决:
1. 先确认rc.local的执行权限
CentOS 7里默认的/etc/rc.d/rc.local文件可能没有可执行权限,这会导致开机时系统跳过它的执行。你可以先执行这个命令给它加上权限:
chmod +x /etc/rc.d/rc.local
顺便提一句,CentOS 7是用systemd管理服务的,rc-local.service依赖这个文件的可执行权限,没有的话服务根本跑不起来。
2. 用绝对路径指定所有内容
命令行里能正常运行,是因为你处在脚本所在的目录,而且当前shell的环境变量能找到python。但开机时rc.local的工作目录是根目录/,环境变量也没完全加载,所以必须写全路径:
- 先查清楚你的
python路径:用which python命令,会输出类似/usr/bin/python的路径 - 然后把
rc.local里的配置改成:
/usr/bin/python /完整路径/test.py start
比如你的脚本在/home/paramore/scripts/test.py,那就要写/usr/bin/python /home/paramore/scripts/test.py start
3. 把脚本输出重定向到日志,方便排查错误
如果还是不行,咱们把脚本的输出和错误信息写到日志文件里,这样开机后就能知道哪里出问题了。修改rc.local的配置行:
/usr/bin/python /完整路径/test.py start >> /var/log/test_script.log 2>&1
开机后查看日志:cat /var/log/test_script.log,里面会有详细的报错信息(比如找不到模块、权限不足之类的)
4. 检查rc-local服务的状态
用systemd命令查看rc-local服务的运行状态,看看有没有启动失败:
systemctl status rc-local.service
如果有错误,用下面的命令看详细日志:
journalctl -u rc-local.service
这能帮你定位服务层面的问题。
更可靠的替代方案:用systemd服务管理脚本
其实在CentOS 7里,rc.local只是兼容旧系统的方式,用systemd创建专门的服务会更可靠,还能方便地启停、查看状态。步骤如下:
- 创建服务文件
/etc/systemd/system/test_script.service,内容如下:
[Unit] Description=我的Test Python脚本 After=network.target # 如果脚本依赖网络,加上这个,不然可以去掉 [Service] Type=forking # 因为你的脚本用了start参数,应该是后台运行的,所以用forking ExecStart=/usr/bin/python /完整路径/test.py start ExecStop=/usr/bin/python /完整路径/test.py stop Restart=on-failure # 脚本崩溃时自动重启 [Install] WantedBy=multi-user.target
- 重新加载systemd配置:
systemctl daemon-reload
- 设置开机自启:
systemctl enable test_script.service
- 现在可以手动测试启动:
systemctl start test_script.service
查看状态:
systemctl status test_script.service
这样配置后,脚本的启动会更稳定,而且systemd会帮你管理它的运行状态。
内容的提问来源于stack exchange,提问作者Paramore

