我正在使用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确实运行了shell (我编写了一些回显),但是什么都没有发生,。
以下是我的crontab代码:
*/1 * * * * /usr/app/keepfront.sh有人知道为什么吗?如何解决这个问题?
发布于 2014-07-22 11:09:56
cron作业不能访问您的环境变量,尽管它们是由用户拥有的,它们不运行在该用户的完整桌面环境中。在这种情况下,您的脚本不知道您的DISPLAY环境变量。要检索信息和进行更改,wmctrl需要知道要使用哪个DISPLAY。
要完成您想做的事情,您只需要在脚本DISPLAY环境变量中设置环境变量,然后再调用wmctrl。假设您只有一个监视器,下面的行将修复您的问题(我的测试很好)。如果您有多个监视器,那么只需在命令行上使用echo $DISPLAY来帮助您为各个监视器配置命令。
# Add to your script before any calls to wmctrl.
export DISPLAY=:0还有一些需要注意的事情:
wmctrl遇到的第一个窗口带到顶部,这将是第一个打开的窗口,因为wmctrl从最老的窗口到最新的窗口都是打开的。crontab运行脚本时不会设置这些变量。您可以找到Firefox使用的所有环境变量的列表,然后在脚本中手动设置它们.*/1行中使用crontab位,只需使用:* * * * * /usr/app/keepfront.sh来每分钟运行一次。crontab文件的顶部--许多人出于各种原因这样做。例如,您的PATH文件中的crontab可能与您的用户PATH不一样,您的LANG变量也不会被设置,这可以阻止cron调用的脚本中使用的正则表达式工作。在我的文件的顶部有以下设置,如下所示:# 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 $PATH和echo $LANG以获取当前设置。
在命令行中键入env将显示所有的环境变量,要查看cron可用的变量有多有限,请将该行添加到crontab中,不要忘记更改我使用过的路径,并在运行后删除行。
* * * * * env > /home/user/EnvOutputFromCrontab希望这能有所帮助。
发布于 2014-01-10 04:04:29
你的问题之一是,这一行不像你想的那样:
WINCOUNT=wmctrl -l | grep -c "$WINTITLE"它运行命令-l (可能不存在),并将WINCOUNT=wmctrl作为其环境变量之一。
你可能打算写:
WINCOUNT=$(wmctrl -l | grep -c "$WINTITLE")您的另一个问题可能是,wmctrl和firefox在没有终端的情况下运行时不能正常工作,因为crontab在没有终端的情况下运行其作业。我还没有尝试过从firefox上运行crontab,我想不出比让火狐每分钟跳转到前台更烦人的事情了(好的;我可以想到一些同样烦人的事情,但是这个概念不值得考虑)。
https://stackoverflow.com/questions/21035930
复制相似问题