You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 01:30:57