我有一个Python脚本,通过下一行通过selenium调用chrome。
ff = webdriver.Chrome('/home/user01/webScraping/CollectAndGo/chromedriver')
python脚本是从shell脚本调用的。
python /home/user01/webScraping/CollectAndGo/cgcom.py > /home/user01/webScraping/CollectAndGo/cgcom.log 2>&1
当我从终端运行脚本或仅执行.sh文件时,它可以正常运行,但是当我计划crontab作业时,它将失败并显示下一个错误。
raise exception_class(message, screen, stacktrace) selenium.common.exceptions.WebDriverException: Message: u'unknown error: Chrome failed to start: exited abnormally\n (Driver info: chromedriver=2.9.248304,platform=Linux 3.5.0-36-generic x86_64)'
该错误与该问题的第一行代码有关。有人知道为什么会这样吗?
尝试从中启动浏览器最明显的问题cron是,即使您的计算机上运行了X,DISPLAY也未为从您的运行中的进程设置环境变量,crontab因此从那里启动浏览器将失败。
cron
DISPLAY
crontab
解决方案的范围从琐碎的到非常复杂的。一个简单的解决方案是,如果没有X运行并且将其手动设置DISPLAY为:0,则脚本将不会运行,并且将其手动设置为Ubuntu启动的默认X服务器的默认显示号。
:0
例如,如果我将此命令放在一行的command列中crontab,Chrome会启动而不会出现问题:
command
DISPLAY=:0 google-chrome
用户特定的crontab文件中的完整行如下所示:
0 * * * * DISPLAY=:0 google-chrome
如果您要运行一个通过selenium启动chrome的python脚本,则该行应如下所示:
0 * * * * DISPLAY=:0 python my_script.py
命令字符串只是按原样发送到外壳,因此在上一个示例中,该字符串DISPLAY=:0 python my_script.py仅会传递到外壳。通常的shell语法是将命令开始时立即给出的变量分配解释为设置环境变量。(dashand 肯定是这种情况,bash在大多数安装中,其中之一可能是默认的shell。)因此,shell解释的命令将环境变量DISPLAY设置为value :0,然后运行python my_script.py。由于python从启动它的外壳程序继承了它的环境,因此变量DISPLAY也:0适用于它。
DISPLAY=:0 python my_script.py
dash
bash
python my_script.py
python
设置DISPLAY=:0像我看到前面设置变量 只 为下面的命令。也可以设置DISPLAY到:0由crontab中执行的所有命令。例如,在以下特定于用户的crontab中:
DISPLAY=:0
DISPLAY=:0 30 * * * * google-chrome 0 * * * * python my_script.py
该行DISPLAY=:0设置了DISPLAY用于执行google-chrome和的环境变量python my_script.py
google-chrome