我正在使用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
任何人都知道为什么?怎么解决这个问题?
答案 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
从最旧到最新的窗口看。
我还没有测试过你脚本的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 $PATH
和echo $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")
问题的另一部分可能是wmctrl
和firefox
在没有终端的情况下无法正常运行,因为crontab
在没有终端的情况下运行其作业。我没有尝试从firefox
运行crontab
,我想不出比让Firefox每分钟跳到前台更令人讨厌的事情(好吧;我可以想到一些同样烦人的事情) ,但这个概念没有考虑到。)