首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >wmctrl不在crontab中工作

wmctrl不在crontab中工作
EN

Stack Overflow用户
提问于 2014-01-10 03:53:49
回答 2查看 1.6K关注 0票数 1

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

下面是我的shell代码(假设它是/usr/app/keepfront.sh):

代码语言:javascript
复制
#!/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代码:

代码语言:javascript
复制
*/1 * * * *   /usr/app/keepfront.sh

有人知道为什么吗?如何解决这个问题?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-07-22 11:09:56

cron作业不能访问您的环境变量,尽管它们是由用户拥有的,它们不运行在该用户的完整桌面环境中。在这种情况下,您的脚本不知道您的DISPLAY环境变量。要检索信息和进行更改,wmctrl需要知道要使用哪个DISPLAY

要完成您想做的事情,您只需要在脚本DISPLAY环境变量中设置环境变量,然后再调用wmctrl。假设您只有一个监视器,下面的行将修复您的问题(我的测试很好)。如果您有多个监视器,那么只需在命令行上使用echo $DISPLAY来帮助您为各个监视器配置命令。

代码语言:javascript
复制
# Add to your script before any calls to wmctrl.
export DISPLAY=:0

还有一些需要注意的事情:

  • 如果您打开了多个“Mozilla”窗口,那么您的代码只会将wmctrl遇到的第一个窗口带到顶部,这将是第一个打开的窗口,因为wmctrl从最老的窗口到最新的窗口都是打开的。
  • 我还没有测试过您的脚本的Firefox方面的启动,从总体上讲,我认为这样做是个坏主意,因为火狐还会使用环境变量,在从crontab运行脚本时不会设置这些变量。您可以找到Firefox使用的所有环境变量的列表,然后在脚本中手动设置它们.
  • 您不需要在您的*/1行中使用crontab位,只需使用:* * * * * /usr/app/keepfront.sh来每分钟运行一次。
  • 您可能希望将一些环境变量添加到crontab文件的顶部--许多人出于各种原因这样做。例如,您的PATH文件中的crontab可能与您的用户PATH不一样,您的LANG变量也不会被设置,这可以阻止cron调用的脚本中使用的正则表达式工作。在我的文件的顶部有以下设置,如下所示:

代码语言:javascript
复制
# 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中,不要忘记更改我使用过的路径,并在运行后删除行。

代码语言:javascript
复制
* * * * * env > /home/user/EnvOutputFromCrontab

希望这能有所帮助。

票数 4
EN

Stack Overflow用户

发布于 2014-01-10 04:04:29

你的问题之一是,这一行不像你想的那样:

代码语言:javascript
复制
WINCOUNT=wmctrl -l | grep -c "$WINTITLE"

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

你可能打算写:

代码语言:javascript
复制
WINCOUNT=$(wmctrl -l | grep -c "$WINTITLE")

您的另一个问题可能是,wmctrlfirefox在没有终端的情况下运行时不能正常工作,因为crontab在没有终端的情况下运行其作业。我还没有尝试过从firefox上运行crontab,我想不出比让火狐每分钟跳转到前台更烦人的事情了(好的;我可以想到一些同样烦人的事情,但是这个概念不值得考虑)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21035930

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档