【问题标题】:Cron job: how to run a script that requires to open display?Cron 作业:如何运行需要打开显示的脚本?
【发布时间】:2012-06-16 10:04:16
【问题描述】:

我想设置一个 cron 作业来运行 python 脚本,但它给了我这个错误:

RuntimeError: could not open display

这是因为我导入了一个需要我打开显示的模块(例如pylab)。即使我的脚本没有生成任何要在监视器上显示的图片。

有什么方法可以让 crontab 在显示打开的情况下运行我的作业(就像我 ssh -X 进入机器一样)?我实际上不需要为监视器生成任何图表。我只需要正确导入我的模块。

【问题讨论】:

  • @aix 我必须直接使用matplotlib API吗?我更喜欢使用 pylab .. 一般来说,有没有办法在 crontab 中解决这个问题?
  • 如果您在脚本顶部添加import matplotlib as mpl; mpl.use('Agg')(在导入pylab 之前),这可能会解决问题。
  • @aix 感谢 aix。你知道一般情况下,如何在 crontab 中打开显示吗?

标签: python linux cron crontab x11


【解决方案1】:

您需要有效的 DISPLAY 和 XAUTHORITY 才能在 Cron 中使用 X-Programms!

设置 DISPLAY 非常简单,输入 Bash:

export DISPLAY=":0.0"

为了获得有效的 XAUTHORITY,您必须寻找它。 在 Debian/Gnome/gdm3 下,它们保存在 var/run/gdm3/*/database 我使用了以下脚本:

export DISPLAY=":0.0"
[ -z $USER ] && USER=$( who | awk '{ print $1 }' | sort | uniq >/tmp/test )
for I in /var/run/gdm3/*; do
    AUTHUSER="`echo $I | awk -F '-' '{ print $3 }'`"
    for J in $USER; do
        [ "${AUTHUSER}" = "${J}" ] || continue
        USER="$J"
        export XAUTHORITY="${I}/database" && break
    done
done
sudo -u ${USER} /Path/to/xProgramm

Var $USER 可以为空,比脚本寻找有效用户,否则你可以告诉脚本 var!

【讨论】:

  • 感谢您的出色回答。通过一些小的修改,我能够使其适用于 Ubuntu 20.04。
  • 那些小的修改是什么?
【解决方案2】:

您还可以使用xvfb 或类似工具在帧缓冲区中运行您的应用程序:

sudo apt-get install xvfb

用法:

xvfb :1 -screen 0 800x600x8 & # WIDTHxHEIGHTxCOLORDEPTH
export DISPLAY=":1"
java application_name.jar 

或更短:

xvfb-run -a -e /tmp/some/log/file.log /home/user/application.run

-a 自动选择显示编号,-e file 指定错误消息的日志文件。

【讨论】:

    猜你喜欢
    • 2016-04-04
    • 1970-01-01
    • 2011-12-05
    • 1970-01-01
    • 2014-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多