Linux wmctrl在crontab中不工作

Linux wmctrl在crontab中不工作,linux,shell,Linux,Shell,我正在使用Linux(Ubuntu)。我使用wmctrl使firefox窗口始终位于顶部。当我在终端上运行shell时,它工作得很好 这是我的shell代码(假设它是/usr/app/keepfront.sh): 我想使用crontab每1分钟运行一次shell。Crontab确实运行了shell(我写了一些回音),但什么也没发生 以下是我的crontab代码: */1 * * * * /usr/app/keepfront.sh 有人知道为什么吗?如何解决这个问题?问题的一部分是,这条线没

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

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

我想使用crontab每1分钟运行一次shell。Crontab确实运行了shell(我写了一些回音),但什么也没发生

以下是我的crontab代码:

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

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

问题的一部分是,这条线没有做你认为它做的事情:

WINCOUNT=wmctrl -l | grep -c "$WINTITLE"
它以
WINCOUNT=wmctrl
作为环境变量之一运行命令
-l
(该命令可能不存在)

你可能打算写:

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

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

您的问题之一是,这条线没有做您认为它做的事情:

WINCOUNT=wmctrl -l | grep -c "$WINTITLE"
它以
WINCOUNT=wmctrl
作为环境变量之一运行命令
-l
(该命令可能不存在)

你可能打算写:

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

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

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

要执行您想要执行的操作,您只需在调用
wmctrl
之前,在脚本中设置
DISPLAY
环境变量。假设您只有一个监视器,下面的行应该可以解决您的问题(我的测试运行良好)。如果您有多个监视器,只需在命令行上使用
echo$DISPLAY
,即可帮助您为各种监视器配置命令

# Add to your script before any calls to wmctrl.
export DISPLAY=:0
还有一些需要注意的事项:

  • 如果您打开了多个“Mozilla Firefox”窗口,那么您的代码只会将
    wmctrl
    遇到的第一个窗口置于顶部,这将是第一个打开的窗口,因为
    wmctrl
    会从最旧的窗口查看到最新的窗口

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

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

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

#这些是基本路径,我的也包括我自己的脚本路径。
路径=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
#注意:LANG允许grep正则表达式在被调用的脚本中正常工作。
LANG=en_GB.UTF-8
提示:键入
echo$PATH
echo$LANG
以获取当前设置

在命令行中键入
env
将显示所有环境变量,要查看
cron
可用的环境变量有多有限,请将此行添加到
crontab
,不要忘记更改我使用的路径,并在运行后删除该行

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

希望这能有所帮助。

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

要执行您想要执行的操作,您只需在调用
wmctrl
之前,在脚本中设置
DISPLAY
环境变量。假设您只有一个监视器,下面的行应该可以解决您的问题(我的测试运行良好)。如果您有多个监视器,只需在命令行上使用
echo$DISPLAY
,即可帮助您为各种监视器配置命令

# Add to your script before any calls to wmctrl.
export DISPLAY=:0
还有一些需要注意的事项:

  • 如果您打开了多个“Mozilla Firefox”窗口,那么您的代码只会将
    wmctrl
    遇到的第一个窗口置于顶部,这将是第一个打开的窗口,因为
    wmctrl
    会从最旧的窗口查看到新的窗口