首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在crontab中运行xprop:“无法打开显示”

在crontab中运行xprop:“无法打开显示”
EN

Unix & Linux用户
提问于 2019-10-17 03:43:47
回答 1查看 2.6K关注 0票数 1

我刚刚制作了一个运行xprop(由常规用户和root用户运行)的Bash脚本:

代码语言:javascript
复制
#!/bin/bash
# time tracking BASH script

# current time and date
current_date=$(date --rfc-3339='seconds')

# active window id
window_id=$(xprop -root 32x '\t$0' _NET_ACTIVE_WINDOW | cut --fields 2)

# active window class
wm_class=$(xprop '\t$0\n' -id $window_id WM_CLASS | cut --fields 2)

# active window name
wm_name=$(xprop '\t$0\n' -id $window_id _NET_WM_NAME | cut --fields 2)

echo '"'$current_date'", '$wm_class', '$wm_name

具有以下输出(以常规用户和根用户的身份运行):

代码语言:javascript
复制
nelson@triplecero:~$ bash-scripts/time-tracking.sh
"2019-10-16 23:28:41-04:00", "konsole", "nelson@triplecero: ~ — Konsole"

脚本是从常规用户crontab中调用的,但是它不像预期的那样工作,它在日志中写入错误消息:"xprop: unable to open display ''",这是当前会话用户不运行x螺旋桨(和任何GUI程序)时显示的典型错误消息,因为我可以以根用户的身份运行xprop (和任何其他GUI程序)。

crontab (用于常规用户)如下所示:

代码语言:javascript
复制
# m h  dom mon dow   command
  * *    *   *   *   /home/nelson/bash-scripts/time-tracking.sh >> /home/nelson/log/time-tracking.log 2>&1
  * *    *   *   *   window_id=$(xprop -root 32x '\t$0' _NET_ACTIVE_WINDOW | cut --fields 2) 2>&1; echo $window_id >> /home/nelson/log/test.log 2>&1
 

第一行使用time-tracking.log中的下列错误消息执行:

代码语言:javascript
复制
xprop:  unable to open display ''
xprop:  unable to open display ''
xprop:  unable to open display ''
"2019-10-16 23:21:01-04:00", ,

第二个只是在test.log中创建空行

我在cron中做错了什么来获取那些错误消息而不是正确的输出?

EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2019-10-17 06:33:50

您缺少了$DISPLAY环境变量。它由初始化GUI会话的第一个进程设置,然后由它的所有子进程继承。对于本地X11会话,值通常为:0

$DISPLAY变量告诉X11应用程序如何与X服务器联系;值:0告诉它们在/tmp/.X11-unix/X0上使用本地Unix套接字。在初始连接之后,可以启用诸如直接呈现基础设施(DRI)这样的高性能访问方法。

Cron作业不会自动获得$DISPLAY变量,因为它们应该独立于GUI会话运行:如果作业的所有者目前没有登录怎么办?如果cron作业能够访问任何人的X11会话,它将使用户能够相互监视,这是完全不可接受的。

根据所使用的发行版,还可能需要设置$XAUTHORITY环境变量。没有它,所有X11工具和应用程序都将假定X11会话cookie位于$HOME/.Xauthority,但作为一个示例,Debian 10为每个用户执行私有$TMP目录,因此$TMP将设置为/tmp/user/$XAUTHORITY将设置为$TMP/xauth--_0以显示:0

如果没有对正确的X11会话cookie的访问,X11服务器将不会响应请求,甚至对根服务器也不会响应。在以常规用户身份登录后运行GUI程序,然后使用susudo成为根用户是可能的,前提是$DISPLAY (以及必要时的$XAUTHORITY )被传递给su/sudo会话--这通常是默认设置的。

票数 3
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/547192

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档