【问题标题】:Script run from crontab can't use xvkbd or xdotool从 crontab 运行的脚本不能使用 xvkbd 或 xdotool
【发布时间】:2015-05-27 05:22:00
【问题描述】:

我想使用简单的 bash 脚本在 2 小时后自动刷新 firefox。 我有:

#!/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
xvkbd -window Firefox -text "\Cr";
exit 0

我想使用 crontab -e 运行它。我添加了任务,但没有任何反应。 当我用终端运行这个脚本时,一切都没有问题。 我还在我的简单脚本中尝试了 xdotool 。 我对诸如“重新加载每个”或“选项卡自动重新加载”之类的 Firefox 附加组件不感兴趣,因为每次重新启动 Firefox 都会丢失附加组件的设置。 任何答案或想法将不胜感激。 谢谢。

【问题讨论】:

  • 您能否评论一下我的编辑是否符合您提出问题的初衷?具体来说,您最初是否尝试将此内容粘贴到 crontab -e (作为 4ae1e1 的答案试图解决),或者您是否未指定您如何配置 crontab 的详细信息,而仅描述您正在运行的脚本的内容那里?
  • 是的,您的编辑符合我的意图。 script.sh 作为独立对象存在,我用crontab -e 引用了这个脚本。我把 script.sh 的路径放在那里并为 crontab 设置工作。下次我会更好地阐明我的意图。谢谢你的帮助。

标签: linux bash crontab


【解决方案1】:

xvkbd 包有些奇怪。最后我找到了另一个解决方案。 我为 Firefox 安装了 MozRepl 插件。 它在.mozilla 目录中创建文件mozrepl@hyperstruct.net.xpi。我浏览了defaults/preferences/mozrepl.js,找到了pref("extensions.mozrepl.autoStart", false); “假”我改为“真”。即使我关闭浏览器,这也是 Firefox 自动运行插件的方式。 我还写了简单的期望脚本:

#!/usr/bin/expect -f
set timeout 10
spawn nc localhost 4040
expect {
"repl>"                {send "BrowserReload(), repl.quit()\r"; exp_continue}
"lost connection"      {puts "ERROR: lost connection"}
"No route to host"     {puts "ERROR: no route to host"}
timeout                {puts "ERROR: timeout"}
}

我还创建了一个 cron 任务:

00 */2 * * * /root/script.exp

【讨论】:

  • 很好——这完全可以解决 X11 的安全问题,我怀疑这是另一个答案的问题所在。 (当然,允许系统上的任何/每个用户——包括nobody,通常用于与不受信任的用户交互的网络进程——来控制你的浏览器有其自身的安全隐患)。
  • 很高兴看到您创建了一个脚本,然后通过 crontab 执行了该脚本。这样做的好处是允许您根据需要创建尽可能复杂的脚本,然后让 cron 执行它们而不会破坏您的 user-crontab 文件。 (只要确保您的脚本是可执行的 (chmod +x)。
【解决方案2】:

crontab 不是 shell 脚本。您应该通过运行man 5 crontab 阅读有关crontab 格式的更多信息。如果这对您来说太令人生畏,您应该在 Google 上搜索无数的 cron 教程。例如,当您搜索“Vixie cron 教程”时,第一个结果是 Newbie: Intro to cron,经过简单检查,这对您入门很有帮助。

对于您的特定用例,请将以下内容放入您的crontab。 (将其粘贴到crontab -e 打开的文本编辑器中,或者将其保存到文件中然后执行crontab FILENAME。我更喜欢后一种方法。您可以通过执行@987654331 查看当前crontab 的内容@. 通过运行 man 1 crontab 了解有关 crontab 命令的更多信息。)

SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

00 */2 * * * xvkbd -window Firefox -text "\Cr"

这样crond 守护进程应该每两个小时运行一次命令xvkbd -window Firefox -text "\Cr",在凌晨 0:00、凌晨 2:00、凌晨 4:00 等。如果您希望在凌晨 1:00 执行此操作am、3:00 am 等,将最后一行替换为

00 1-23/2 * * * xvkbd -window Firefox -text "\Cr"

第一个 00 是分钟,因此您也可以将其替换为 30:

30 */2 * * * xvkbd -window Firefox -text "\Cr"

然后命令在凌晨 0:30、凌晨 2:30 等运行。

与往常一样,请阅读手册页 (man 5 crontab) 或 tutorial 了解更多信息。 SO 不适用于完整的教程。

【讨论】:

  • 顺便说一句,我不确定命令xvkbd -window Firefox -text "\Cr" 的正确性。我只告诉你如何使用cron。您应该自己验证它确实会刷新 Firefox。
  • 他可以添加00 */2 * * * /path/to/his/script 作为 crontab 条目。在这种情况下,检查它是否可执行是正确的。此外,最近的发行版已开始为普通用户禁用 crontab。那将是另一次检查。
  • 感谢您的重播。我总是阅读手册并尝试尽可能多地理解。这次我卡住了。 Crontab 返回:(root) CMD (/root/script.sh)。 script.sh 包含 "xvkbd -window Firefox -text "\Cr"。似乎 script.sh 正在运行(出于测试目的,我已添加到 cron * * * * * /root/script.sh)但网站不刷新。究竟是什么问题?crontab 中的其他脚本运行正常。
  • @dmwsky 请先照我说的做。另外,正如我所提到的,您确定命令正确吗?
  • 这里是否正确处理了 DISPLAY 变量(以及任何其他 X11 安全措施)?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-06
  • 1970-01-01
  • 2017-11-20
  • 2018-08-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多