【问题标题】:Cron xdotool doesn't runCron xdotool 不运行
【发布时间】:2016-11-18 10:02:43
【问题描述】:

我是使用 crontab 的新手,我一直在尝试做一个简单的 cron 工作。 我想每 1 分钟按一次 F5 来刷新 Mozzila Firefox。我正在使用 xdotool 按 F5。 我有脚本 /usr/local/bin/refresh.sh:

#!/bin/bash  
xdotool search --name "Mozilla Firefox" key F5

如果我在命令行中运行它,它工作正常。和许可:

-rwxr-xr-x. 1 root root 89 15. čec 10.32 refresh.sh

crontab 我有:

*/1 * * * * cd /usr/local/bin && sh refresh.sh

但是 cron 运行的脚本不起作用。 谁能告诉我我做错了什么?

【问题讨论】:

  • 您需要传递任何DISPLAY 变量吗?日志中有任何内容吗?
  • 是的,我忘记了位置 Display=: 0,谢谢你

标签: shell cron centos crontab xdotool


【解决方案1】:

xdotool 命令是 X11 的自动化工具,允许您模拟键盘/鼠标输入,但由于 crontab 是独立运行的,因此需要定义 DISPLAY 变量来指定要使用的 X Window System 显示服务器。通常,当您登录桌面时,此变量会自动分配,但 crontab 在隔离环境中运行作业(甚至没有关联的 tty),尤其是当您通过root 帐户运行命令时。

所以简而言之,你应该像这样定义你的工作:

*/1 * * * * DISPLAY=:0 /usr/local/bin/refresh.sh

或者您可以在文件开头定义变量(在 Vixie cron 的情况下)。见:Variables in crontab?

还要确保运行作业的用户已授予对选定 X 显示器的访问权限。如果您需要授予访问权限,您需要通过xhostsetfacl 命令分配权限并指定额外的XAUTHORITY 变量,请参阅:Xdotool using “DISPLAY=:0” 了解更多详情。

【讨论】:

    【解决方案2】:

    所以我尝试了很多东西,但由于某种原因在 Ubuntu 18.04 echo $display 上返回了 :1 而不是 :0。此外,似乎工作的唯一环境变量设置器正在添加:

    export DISPLAY=":1"
    

    直接到 cron 正在运行的脚本。

    【讨论】:

      【解决方案3】:

      首先,正如 Parth 所说,确保在终端上键入 echo $DISPLAY 并获取输出(对我来说,出于某种原因它是 :10.0)。然后在您从 cron 调用的脚本中,在调用 xdotool 之前,编写以下内容:

      export DISPLAY=:10.0 
      
      #instead of :10.0 write your own output from before
      
      export XAUTHORITY=/root/.Xauthority  
      
      #if you are not a root user, instead of /root/.Xauthority write ~/.Xauthority
      

      【讨论】:

        【解决方案4】:

        为什么不

        */1 * * * * /usr/local/bin/refresh.sh
        

        cd /usr/local/bin 在这里不是必需的,因为您没有在 /usr/local/bin 中运行 cron 作业

        在下面的场景中你需要cd

        */1 * * * * cd /usr/local/bin && ls >/var/somelog # wish to execute ls in a particular directory
        

        【讨论】:

        • 你说得对,我在 "/usr/local/bin" 中有 "test.log" 用于 refresh.sh 的输出
        【解决方案5】:

        如果有人想用不同的工具安排 xdotool 命令,可以使用 At 命令(参见the tutorial)。因此,为了工作,您必须定义环境变量 DISPLAY(如 Kenorb 所解释的)。我首先从该变量 (echo $DISPLAY) 中获取当前值,以便在我的脚本文件中设置 (export DISPLAY=:0)。然后,它可以像这样运行:

        at xx:xx -f your_shell_script_file
        

        【讨论】:

          【解决方案6】:

          你可以试试这个

          */1 * * * * DISPLAY=:0 /usr/local/bin/refresh.sh

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2013-07-02
            • 1970-01-01
            • 2015-05-27
            • 2017-04-07
            • 2012-10-22
            相关资源
            最近更新 更多