Linux下Cronjob执行Python Selenium脚本异常问题求助
Cron执行Shell脚本异常问题排查与修复
问题描述
编写了一个Shell脚本用于通过Cronjob执行Python脚本,直接运行Shell脚本或Python脚本均无异常,但通过Cronjob执行时出现问题。相关脚本与配置如下:
Shell脚本
#!/bin/bash # Set environment variables export XDG_RUNTIME_DIR=/run/user/$(id -u) export PATH=$PATH:/snap/bin export DISPLAY=:0 #export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin #echo "Current Date and time: $(date)" #echo "current directory: $(pwd)" #Xvfb :99 -screen 0 1024x768x24 & #export PATH=$PATH:/usr/local/bin #export DISPLAY=:0 #:99 LOGFILE=/opt/runscript.log echo "Script Started at $(date)" >> $LOGFILE cd /home/carson/Documents/code/python/speech2txt source /home/carson/Documents/code/python/speech2txt/venv/bin/activate #source ./venv/bin/activate #/usr/bin/python3 /home/carson/Documents/code/python/speech2txt/createAudio.py >> /opt> #/usr/bin/python3 /home/carson/Documents/code/python/speech2txt/cronBrowser.py >> $LOG> su - carson -c "/usr/bin/python3 /home/carson/Documents/code/python/speech2txt/cronBro> #echo "exit status $?" deactivate if [ $? -eq 0 ]; then echo "Script Success - $(date)" >> $LOGFILE else echo "Script Failure - $(date)" >> $LOGFILE fi
Cronjob配置
12 16 * * * carson /opt/run.sh #08 22 * * * PATH=$PATH:/usr/local/bin/:/usr/bin/:/usr/sbin:/bin && DISPLAY=:0 && /opt/run.sh ##47 21 * * * export XDG_RUNTIME_DIR=/run/user/$(id -u) && export PATH=$PATH:/snap/bin && /opt/run.sh >> /opt/runscript.log 2>&1
问题分析与修复步骤
1. 环境变量覆盖问题
- 脚本中使用
su - carson -c会重新初始化用户环境,覆盖之前设置的DISPLAY、XDG_RUNTIME_DIR等变量,导致Python脚本无法获取正确的桌面环境,直接删除该调用即可。 - 激活虚拟环境后,直接使用虚拟环境内的
python命令(而非系统的/usr/bin/python3),确保依赖包正确加载。
2. 日志与错误捕获问题
- 原脚本仅部分命令输出到日志,且未捕获错误输出,建议统一重定向所有输出到日志,方便排查。
- 确保
/opt/runscript.log拥有carson用户的读写权限,否则日志无法写入,可执行sudo chown carson:carson /opt/runscript.log设置权限。
3. 路径与执行逻辑问题
cd命令未处理失败情况,若目录不存在会导致后续命令出错,需添加|| exit 1确保目录切换成功。- 虚拟环境激活失败时直接退出脚本,避免后续无效执行。
修复后的Shell脚本
#!/bin/bash # 开启调试模式,输出每一步执行命令(排查完成后可注释) set -x # 统一重定向所有标准输出和错误到日志 LOGFILE=/opt/runscript.log exec >> $LOGFILE 2>&1 echo "Script Started at $(date)" # 设置必要的环境变量 export XDG_RUNTIME_DIR=/run/user/$(id -u) export PATH=$PATH:/snap/bin export DISPLAY=:0 # 切换到工作目录,失败则退出 cd /home/carson/Documents/code/python/speech2txt || exit 1 # 激活虚拟环境,失败则退出 source ./venv/bin/activate || exit 1 # 执行Python脚本 python cronBrowser.py # 保存脚本执行的退出状态 EXIT_CODE=$? # 退出虚拟环境 deactivate # 记录执行结果 if [ $EXIT_CODE -eq 0 ]; then echo "Script Success - $(date)" else echo "Script Failure - $(date), Exit Code: $EXIT_CODE" fi
优化后的Cron配置
12 16 * * * carson /opt/run.sh
(若需要在Cron中直接捕获日志,可改为:12 16 * * * carson /opt/run.sh >> /opt/runscript.log 2>&1)
内容的提问来源于stack exchange,提问作者Bigbear
相关产品推荐
相关产品推荐

