OpenWrt下添加至rc.local的开机自启Python脚本print无控制台输出问题
问题根因
- 系统初始化阶段执行的
/etc/rc.local属于系统后台服务类进程,默认没有绑定任何用户终端(TTY/PTY),标准输出、标准错误的默认输出目标为/dev/null,你第二个后台启动的Python进程没有指定输出重定向,所有打印内容会被直接丢弃,不会输出到你后续登录后看到的控制台。 - 你手动执行
script.sh时是在已登录的终端会话下操作,进程的标准输出默认绑定当前终端,所以可以正常看到打印内容。 - 第一个Python启动命令因为显式指定了输出重定向到
/root/saved.txt,所以内容可以正常写入文件。
解决方案
方案1:指定输出到固定终端
如果你需要内容直接打印到指定终端(比如设备直连的串口控制台、HDMI控制台),可以先执行w命令查看对应终端的设备路径(常见串口控制台为ttyS0,物理终端为tty1,SSH登录终端一般为pts/0等),然后修改启动命令,把输出重定向到对应终端设备即可:
# 示例为输出到串口控制台ttyS0,2>&1代表把标准错误也合并到标准输出 /usr/bin/python3 /root/bootpython.py > /dev/ttyS0 2>&1 &
注意该方案绑定的终端如果不存在(比如你没有通过SSH登录时pts/0不存在),进程会输出失败。
方案2:输出到日志文件(更推荐)
后台运行的进程更建议把输出写入日志文件,需要查看时主动读取即可,不存在终端绑定的限制:
# >> 为追加写入,避免重启后覆盖历史日志 /usr/bin/python3 /root/bootpython.py >> /root/bootpython_run.log 2>&1 &
需要查看内容时执行cat /root/bootpython_run.log即可,要实时监控输出可以执行tail -f /root/bootpython_run.log。
可选优化
如果你的Python脚本后续改成长驻后台运行的循环逻辑,建议启动时加-u参数禁用Python的标准输出缓冲区,避免打印内容延迟写入文件/终端:
/usr/bin/python3 -u /root/bootpython.py >> /root/bootpython_run.log 2>&1 &
内容的提问来源于stack exchange,提问作者Sourabrt
相关产品推荐
相关产品推荐

