1

我在 python 脚本中使用dryscrape 。python 脚本在 bash 脚本中调用,该脚本由 cron 运行。对于那些可能不知道的人,dryscrape 是一个无头浏览器(在后台使用 QtWebkit - 所以需要一个 xsession)。

以下是关于我遇到的问题的要点

  1. 当我从命令行运行 python 脚本时,它可以工作
  2. 当我从命令行运行 bash 脚本时,它也可以工作

我发现这可能与我的命令提示符和 cron 作业运行时之间的不同环境有关,因此我修改了我的 bash 脚本以获取我的 .profile ,如下所示:

#/bin/bash

. /full/path/to/my/home/directory/.profile

python script_to_run.py

这是我的 cronjob crontab 条目的样子:

0,55 14-22 * * 1-5 /path/to/script.sh >> $(date "+/path/to/logs/\%Y\%m\%d.mydownload.log" )

顺便说一句,我知道作业正在运行(我可以在 /var/log/syslog 中看到条目,并且脚本还写入日志文件 - 这是我收到以下错误消息的地方):

在所有情况下,我都收到以下错误消息:

无法连接到 X 服务器。在创建会话之前尝试调用 dryscrape.start_xvfb()

我已经在我的机器上安装了先决条件(显然 - 因为它在命令行上运行)。目前,我已经没有想法了。

是什么导致脚本在控制台上运行良好,然后在由 cron 运行时失败?

[[相关详情]]

  • 操作系统:Linux 16.0.4 LTS
  • bash:版本 4.3.46(1)
  • cron 用户:我自己(即命令提示符下的同一用户)
  • 干刮:版本 1.0.1
4

2 回答 2

1

对此的解决方案是dryscrape.start_xvfb()在开始 dryscrape 会话之前调用该方法。

于 2017-01-28T20:51:09.060 回答
0

Cron 用户没有显示,因此您无法运行任何需要显示的命令。您需要修改 python 脚本以不使用任何类型的显示(仔细检查,因为某些 python 命令,即使它们没有打开任何显示,它们也会在内部检查此变量)。最好的测试方法是在没有 Display 的情况下 ssh 进入机器,并检查是否可以从那里运行它而不会出现错误。

于 2017-01-27T17:03:58.437 回答