2

firefox で dlink 管理ページを開き、ADSL 接続または切断を行う ruby​​ スクリプトを作成しました。

このスクリプトをターミナルで問題なく実行できました。しかし、それを 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

どんな助けでも大歓迎です。

4

3 に答える 3

3

有効な X サーバーを指す DISPLAY 環境が必要です。これには、値 ":0.0" (引用符なし) を設定して、ローカル標準の DISPLAY を参照する必要があります。

X 仮想フレーム バッファー (xvfb) を実行すると、Firefox は単純にそれを表示として使用します。これは、Firefox がすべてのグラフィカル操作を実行できるが、標準のグラフィカル環境から独立していることを意味します。xvfb インスタンスを指すように、DISPLAY 変数を適切に設定する必要があります。たとえば、次のように xvfb を呼び出すとします。

Xvfb :1 -screen 0 1600x1200x32

次に、DISPLAY変数を:1に設定することでこれを使用できるようになります

本格的な Firefox インスタンスを起動して、モデムを接続または切断するだけです。ほとんどの場合、「curl」を使用して適切な HTTP リクエストをサーバーに送信し、サーバーが接続または切断を実行できるようにします。何を再作成する必要があるかを簡単に確認する 1 つの方法は、LiveHTTPHeaders などの Firefox プラグインをインストールし、アクションを手動で実行するときに最も重要な HTTP 要求を書き留めることです。

curl 用の ruby​​ バインディングもあります: libcurl for Ruby。結果のスクリプトは、現在のスクリプトよりもはるかに小さくなります。

于 2008-09-27T12:58:09.947 に答える
1

cron から実行されるプログラムには、インタラクティブな環境がありません。したがって、それらには DISPLAY 変数がないため、Firefox などの X (グラフィカル) プログラムを実行することはできません。

Firefox を自動化するよりも、Ruby で HTTP 接続を自分で行うことをお勧めします。

于 2008-09-27T12:54:22.763 に答える
0

crontab エントリが間違っています

のようです

#min  hour  day  month  dow  user                command
55    17    *    *      *    ur_user_is_missing  ruby /home/raguanu/Dropbox/nettie.rb >> /tmp/cron_test
于 2008-09-27T12:51:46.280 に答える