2014-01-10 132 views
1

我正在使用Linux(Ubuntu)。我使用wmctrl使firefox窗口始終處於頂部。當我在終端上運行shell時,它運行FINE。wmctrl在crontab中不工作

這裏是我的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來運行shell每1分鐘。 Crontab DID運行shell(我寫了一些回聲),但沒有任何事發生

這裏是我的crontab代碼:

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

人知道爲什麼?如何解決這個問題?

回答

3

cron作業無權訪問您的環境變量,儘管它們由用戶所有,但它們並未在該用戶的完整桌面環境中運行。在這種情況下,您的腳本不知道您的DISPLAY環境變量。要檢索信息並進行更改wmctrl需要知道使用哪個DISPLAY

做你想做的事,你需要的是以前到wmctrl任何呼叫設置DISPLAY環境變量在腳本中。假設你只有一臺顯示器,下面這行應該解決你的問題(我的測試工作正常)。如果您有超過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文件的頂部 - 許多人因各種原因出現。例如crontab文件中的PATH可能與您的用戶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 

希望這會有所幫助。

+0

添加'export DISPLAY =:0'後它很好用,你的建議很棒。 – Marks

0

你的問題的一個部分是,這一行沒有做什麼你認爲它的作用:

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

它運行與WINCOUNT=wmctrl命令-l(這可能不存在)作爲其環境的一個變量。

你可能打算寫:

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

你的問題的另一部分可能是wmctrlfirefox當不使用終端運行不正常,如crontab運行其作業,而終端。我還沒有試過從crontab開始運行firefox,我想不出有什麼更讓人討厭的東西比Firefox每分鐘跳到前臺(OK;我可以想到一些關於同樣煩人的事情,但是這個概念不承擔思考)。

+0

你說得對第一點。 WINCOUNT = $(wmctrl -l | grep -c「$ WINTITLE」)可以工作,加上看起來更好。雖然我仍然需要始終保持最佳狀態,但是你有什麼想法嗎? – Marks