为什么我不能使用 sudo 从 crontab 运行 GUI 应用程序,而我可以使用 sudo:“未指定协议”?

为什么我不能使用 sudo 从 crontab 运行 GUI 应用程序,而我可以使用 sudo:“未指定协议”?

这里有一些背景知识,因为它可能是问题的原因。我在 Orange Pi Zero 上运行 Armbian Legacy Jessie。它不包括桌面,所以我安装了 X、lightdm 和 Xfce。我还没有设法在启动时启动 X,所以我在 crontab 中有一个 @reboot 行,它执行一个包含以下内容的脚本:

#!/bin/bash
while ! ping -c 1 -W 1 192.168.1.100; do
    sleep 1
done
/usr/bin/startx

一切都很完美(我启用了自动登录,并且它在 1:0 上启动了 Mumble 客户端)。然后,我有一个 python 脚本来监视我的 GPIO(即按即说按钮),并在按下按钮时发送“Ctrl + 1”。 Mumble 正在收听该组合并在按下时开始广播。

我必须以 root 身份运行 python 脚本才能访问 GPIO,因此我添加了这些行/etc/profile(以便 root 可以访问 X):

export DISPLAY=:1.0
export XAUTHORITY=/home/icuser/.Xauthority

正如我所说,当使用 sudo 执行时,效果非常好:

sudo python /home/icuser/sendptt_zero.py

但是当我使用(crontab中的@reboot)执行脚本时:

sudo /usr/bin/python /home/icuser/sendptt_zero.py >> /home/hallgren/ic.log 2>&1 &

我在 ic.log 文件中得到了这个(当我按下 gpio 按钮时,它启动了 Python 中的模拟键盘按键功能(我正在使用http://www.autopy.org/)):

No protocol specified
Could not open main display

我的 Python 脚本也有这一行(没有它就无法工作):

os.environ['DISPLAY'] = ':1.0'

您对如何让它自动启动 X 以及为什么它可以通过 sudo 从命令行运行但在从 crontab 启动时不起作用有什么想法吗?

答案1

克朗不使用/etc/profile.

将变量写入文件顶部crontab

相关内容