wmctrl无法在crontab中工作

时间:2014-01-10 03:53:49

标签: linux shell

我正在使用Linux(Ubuntu)。我使用wmctrl使firefox窗口始终位于顶部。当我在终端上运行shell时,它工作得很好。

这是我的shell代码(说它是/usr/app/keepfront.sh):

#!/bin/bash
WINTITLE="Mozilla Firefox" # Main Firefox window has this in titlebar
PROGNAME="firefox mywebsite --sync" #run the firefox program

#Use wmctrl to list all windows, count how many contain WINTITLE
WINCOUNT=wmctrl -l | grep -c "$WINTITLE"

if [ $WINCOUNT != 0 ]
then
    wmctrl -a "$WINTITLE" # If it exists, bring window to front
else
    $PROGNAME & # Otherwise, just launch ff
fi
exit 0

我想使用crontab每1分钟运行一次shell。 Crontab DID运行shell(我写了一些回声),但没有发生任何事情

这是我的crontab代码:

*/1 * * * *   /usr/app/keepfront.sh

任何人都知道为什么?怎么解决这个问题?

2 个答案:

答案 0 :(得分:3)

cron作业无法访问您的环境变量,尽管它们归用户所有,但并未在该用户的完整桌面环境中运行。在这种情况下,您的脚本不了解您的DISPLAY环境变量。要检索信息并进行更改wmctrl,需要知道要使用哪个DISPLAY

要执行您想要执行的操作,您只需在脚本之前设置DISPLAY环境变量,然后再调用wmctrl。假设您只有1个显示器,下面的行应该可以解决您的问题(我的测试工作正常)。如果您有多个监视器,那么只需在命令行上使用echo $DISPLAY来帮助您配置各种监视器的命令。

# Add to your script before any calls to wmctrl.
export DISPLAY=:0

其他一些注意事项:

  • 如果你有多个Mozilla Firefox'窗口打开然后你的代码只会将wmctrl遇到的第一个带到顶部,这将是首先打开的那个,因为wmctrl从最旧到最新的窗口看。

    < / LI>
  • 我还没有测试过你脚本的Firefox方面的启动,从一般来说,我认为这样做是个坏主意,因为Firefox也会使用环境变量,这些变量在运行脚本时不会被设置来自crontab。您可以找到Firefox使用的所有环境变量的列表,然后在脚本中手动设置它们......

  • 您的*/1行中不需要crontab位,只需使用:* * * * * /usr/app/keepfront.sh每分钟运行一次。

  • 您可能希望在crontab文件的顶部添加一些环境变量 - 许多人出于各种原因这样做。例如,PATH文件中的crontab可能与您的用户PATH不一样,您的LANG变量也不会被设置,这可以阻止cron调用的脚本中使用的正则表达式起作用。我在crontab文件的顶部处设置了以下内容,如下所示:

# These are the basic paths, mine also includes my own scripts path.
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

# Note: LANG allows grep regexes to work properly in called scripts.
LANG=en_GB.UTF-8

提示:输入echo $PATHecho $LANG以获取当前设置。

在命令行中输入env会显示您的所有环境变量,以查看cron可用的有限内容,将此行添加到crontab,不要“忘记改变我使用的路径,并在线路运行后将其删除。

* * * * * env > /home/user/EnvOutputFromCrontab

希望这有帮助。

答案 1 :(得分:0)

你问题的一部分是这条线没有按照你的想法行事:

WINCOUNT=wmctrl -l | grep -c "$WINTITLE"

它运行命令-l(可能不存在),WINCOUNT=wmctrl作为其环境变量之一。

您可能打算写:

WINCOUNT=$(wmctrl -l | grep -c "$WINTITLE")

问题的另一部分可能是wmctrlfirefox在没有终端的情况下无法正常运行,因为crontab在没有终端的情况下运行其作业。我没有尝试从firefox运行crontab,我想不出比让Firefox每分钟跳到前台更令人讨厌的事情(好吧;我可以想到一些同样烦人的事情) ,但这个概念没有考虑到。)