Jetson Nano(Ubuntu 18.04)网络连通时自动运行Python脚本问题咨询
问题原因及解决方案
/etc/network/if-up.d下的脚本默认以root身份执行,和你手动执行时用的普通用户环境完全不同,是核心问题所在:- 普通用户通过pip安装的第三方依赖包默认存在
~/.local/lib路径下,root用户默认不会读取该路径,会触发模块不存在的报错直接导致脚本退出 - 如果你的Python脚本依赖GUI相关能力,root用户默认没有
DISPLAY环境变量,也会启动失败
- 普通用户通过pip安装的第三方依赖包默认存在
- 你脚本里的
pkill python3逻辑存在严重问题:root身份执行该命令会杀掉系统所有用户的python3进程,包括系统自带的服务进程,大概率会引发异常中断,建议改为精准匹配你自己的脚本进程:pkill -f "launcher.py" - 你当前没有捕获脚本运行的错误日志,无法定位具体失败原因
- 注意你提供的脚本示例中
mkdir命令的路径多写了空格(/home /user_name/),会导致创建路径错误,如果你实际脚本也是这么写的需要修正
修复步骤
- 首先修改你的
run_when_connection_available脚本,添加日志输出、指定执行用户,修改后参考内容如下:
#!/bin/sh # 开启日志输出,所有运行信息和错误都会写入该文件,方便排查问题 exec > /var/log/conn_auto_run.log 2>&1 echo "脚本开始运行,时间:$(date)" mkdir /home/user_name/dummy_folder_00 # 精准杀之前的同名脚本进程,避免误杀其他系统Python进程 pkill -f "launcher.py" cd /home/user_name/projects/folder # 替换user_name为你自己的实际用户名,用普通用户身份执行Python脚本 # 后面的Python版本号替换为你Jetson Nano实际使用的版本,可通过python3 --version查询 sudo -u user_name PYTHONPATH=/home/user_name/.local/lib/python3.6/site-packages /usr/bin/python3 launcher.py --arg01 --arg02 ... mkdir /home/user_name/dummy_folder_01 echo "脚本执行完成"
- 修改完脚本后重新放到
/etc/network/if-up.d目录,保持可执行权限。 - 如果脚本还是启动失败,直接查看
/var/log/conn_auto_run.log文件的内容,就能看到具体的报错信息,对应修复即可。
可选优化:确保互联网连通后再执行脚本
如果你需要避免网卡刚连上但互联网还没通的场景,可以在执行Python脚本前添加连通性检测逻辑:
# 检测互联网连通,最多重试5次 RETRY_COUNT=5 while [ $RETRY_COUNT -gt 0 ]; do ping -c 2 223.5.5.5 > /dev/null 2>&1 if [ $? -eq 0 ]; then break fi RETRY_COUNT=$((RETRY_COUNT-1)) sleep 1 done if [ $RETRY_COUNT -eq 0 ]; then echo "互联网连通检测失败,退出脚本" exit 1 fi
内容的提问来源于stack exchange,提问作者Carlo
相关产品推荐
相关产品推荐

