Вопрос

Я написал скрипт ruby, который открывает страницу администратора dlink в Firefox и выполняет ADSL-подключение или разъединение.

Я мог бы запустить этот скрипт в терминале без каких-либо проблем.Но если я помещу это как задание cron, это не запустит firefox.

Это запись, которая у меня есть в кронтаб

# 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 открывался, чтобы эта автоматизация работала.Вот /главная страница/raguan/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

Любая помощь приветствуется.

Это было полезно?

Решение

У вас должна быть среда ОТОБРАЖЕНИЯ, указывающая на действительный X-сервер.Это может либо включать установку для него значения ": 0.0" (без кавычек), такого, чтобы оно относилось к вашему локальному стандартному ДИСПЛЕЮ.

Однако есть несколько вещей, о которых следует помнить:Вы могли бы запустить X virtual frame buffer (xvfb), чтобы Firefox просто использовал его при отображении.Это означало бы, что Firefox сможет выполнять все свои графические операции, но будет независим от вашей стандартной графической среды.Вам нужно будет соответствующим образом настроить переменную DISPLAY, чтобы она указывала на экземпляр xvfb.Например, если вы вызываете xvfb следующим образом:

Xvfb :1 -screen 0 1600x1200x32

Затем вы сможете использовать это, установив для переменной DISPLAY значение: 1

Вы запускаете полноценный экземпляр firefox, чтобы просто подключить или отключить свой модем.Скорее всего, вы сможете использовать "curl" для отправки соответствующих HTTP-запросов на сервер, чтобы он выполнял подключение или разъединение за вас.Одним из способов тривиально увидеть, что вам следует воссоздать, было бы установить плагин Firefox, такой как LiveHTTPHeaders, и записывать наиболее важные HTTP-запросы при выполнении действий вручную.

Есть даже привязка ruby к curl:libcurl для Ruby.Результирующий скрипт должен быть намного меньше вашего текущего скрипта.

Другие советы

Программы, запускаемые из cron, не имеют вашей интерактивной среды.Поэтому у них нет переменной и DISPLAY, и поэтому вы не можете запускать какие-либо X (графические) программы, напримерFirefox.

Я бы предложил выполнять HTTP-соединения самостоятельно, в ruby, вместо того, чтобы пытаться автоматизировать Firefox.

запись в crontab неверна

это похоже на

#min  hour  day  month  dow  user                command
55    17    *    *      *    ur_user_is_missing  ruby /home/raguanu/Dropbox/nettie.rb >> /tmp/cron_test
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top