2008-09-27 39 views
2

我已經寫了一個ruby腳本,它在Firefox中打開dlink管理頁面,並執行ADSL連接或斷開連接。firefox not opening - cron,ruby,firewatir

我可以在終端中運行這個腳本沒有任何問題。但是,如果我把它作爲cron的工作,它不會觸發firefox。

這是我有條目的crontab

# connect to dataone 
55 17 * * * ruby /home/raguanu/Dropbox/nettie.rb >> /tmp/cron_test 

我看到在/ tmp/cron_test以下條目。所以看起來腳本的確運行了。

PROFILE: 
i486-linux 
/usr/bin/firefox -jssh 

但我不明白爲什麼我沒有看到Firefox的開放,爲此自動工作。這裏是/home/raguanu/Dropbox/nettie.rb

#!/usr/bin/ruby -w 

require 'rubygems' 
require 'firewatir' 
require 'optiflag' 

module Options extend OptiFlagSet 
    character_flag :d do 
     long_form 'disconnect' 
     description 'Mention this flag if you want to disconnect dataone' 
    end 

    flag :l do 
     optional 
     long_form 'admin_link' 
     default 'http://192.168.1.1' 
     description 'Dlink web administration link. Defaults to http://192.168.1.1' 
    end 

    flag :u do 
     optional 
     long_form 'user' 
     default 'admin' 
     description 'Dlink administrator user name. Defaults to "admin"' 
    end 

    flag :p do 
     optional 
     long_form 'password' 
     default 'admin' 
     description 'Dlink administrator password. Defaults to "admin"' 
    end 

    flag :c do 
     optional 
     long_form 'connection_name' 
     default 'bsnl' 
     description 'Dataone connection name. Defaults to "bsnl"' 
    end 

    extended_help_flag :h do 
     long_form 'help' 
    end 

    and_process! 
end 

class DlinkAdmin 
    include FireWatir 

    def initialize(admin_link = "http://192.168.1.1", user = 'admin', pwd = 'admin') 
     @admin_link, @user, @pwd = admin_link, user, pwd 
    end 

    def connect(connection_name = 'bsnl') 
     goto_connection_page connection_name 

     # disconnect prior to connection 
     @browser.button(:value, 'Disconnect').click 

     # connect 
     @browser.button(:value, 'Connect').click 

     # done! 
     @browser.close 
    end 

    def disconnect(connection_name = 'bsnl') 
     goto_connection_page connection_name 

     # disconnect 
     @browser.button(:value, 'Disconnect').click 

     # done! 
     @browser.close  
    end 

    private 
    def goto_connection_page(connection_name = 'bsnl') 
     @browser ||= Firefox.new 
     @browser.goto(@admin_link) 

     # login 
     @browser.text_field(:name, 'uiViewUserName').set(@user) 
     @browser.text_field(:name, 'uiViewPassword').set(@pwd) 
     @browser.button(:value,'Log In').click 

     # setup > dataone 
     @browser.image(:alt, 'Setup').click 
     @browser.link(:text, connection_name).click 
    end 
end 

admin = DlinkAdmin.new(Options.flags.l, Options.flags.u, Options.flags.p) 

unless Options.flags.d? 
    admin.connect(Options.flags.c) 
else 
    admin.disconnect(Options.flags.c) 
end 

任何幫助表示讚賞。

回答

3

您需要有一個指向有效X服務器的DISPLAY環境。這可能涉及將其設置爲值「:0.0」(不含引號),以便它引用您的本地標準DISPLAY。

有幾點需要注意: 您可以運行X虛擬幀緩衝區(xvfb),以便Firefox在顯示時簡單地使用它。這意味着Firefox將能夠完成所有的圖形操作,但它將獨立於您的標準圖形環境。您必須適當地設置DISPLAY變量,以便它指向xvfb實例。舉例來說,如果你調用XVFB如下:

Xvfb :1 -screen 0 1600x1200x32 

然後你就可以通過設置DISPLAY變量來使用:1

你開始一場全面的Firefox實例來簡單地連接或斷開調制解調器。您很可能可以使用「curl」將適當的HTTP請求發送到服務器,以便它爲您執行連接或斷開連接。一種平凡看到應該重新創建的方法是安裝Firefox插件,例如LiveHTTPHeaders,並在手動執行操作時記下最重要的HTTP請求。

甚至還有一個用於捲曲的ruby綁定: libcurl for Ruby。結果腳本應該比當前腳本小得多。

0

crontab條目是錯誤的

它就像

#min hour day month dow user    command 
55 17 * *  * ur_user_is_missing ruby /home/raguanu/Dropbox/nettie.rb >> /tmp/cron_test 
+0

只有系統crontab需要用戶字段,而不是每個用戶的個人crontab。 – 2008-09-27 13:08:36

+0

@mana:道格拉斯是對的。我可以在沒有用戶名的情況下運行cron作業。同樣如您在問題中看到的,我可以運行cron作業。只是我無法在顯示器中看到firefox。 – rpattabi 2008-09-27 16:16:53

1

程序從cron運行沒有交互式環境。因此,它們不具有DISPLAY變量,因此不能運行任何X(圖形)程序,例如Firefox瀏覽器。

我建議你自己做ruby中的HTTP連接,而不是試圖自動化Firefox。