Firefox не открывается - cron, ruby, firewatir

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

Я мог без проблем запустить этот скрипт в терминале. Но если я поставлю это как задание 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

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

Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Шаг 1: Создание приложения Slack Чтобы создать Slackbot, вам необходимо создать приложение Slack. Войдите в свою учетную запись Slack и перейдите на...
2
0
2 145
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

Это похоже на

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

Поле пользователя требуется только для системного crontab, а не для индивидуального crontab каждого пользователя.

Douglas Leeder 27.09.2008 17:08

@mana: Дуглас прав. Я мог бы нормально запускать задания cron без имени пользователя. Также, как вы видите в вопросе, я мог запустить задание cron. Просто я не видел firefox на дисплее.

rpattabi 27.09.2008 20:16

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

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

Ответ принят как подходящий

Вам необходимо иметь среду DISPLAY, указывающую на действительный X-сервер. Это может включать установку значения ": 0.0" (без кавычек), чтобы оно относилось к вашему локальному стандартному ДИСПЛЕЮ.

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

Xvfb :1 -screen 0 1600x1200x32

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

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

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

Также обратите внимание, что простой установки переменной DISPLAY может быть недостаточно для присоединения к существующему дисплею, поскольку могут быть файлы конфигурации и файлы прав доступа, которые должны быть расположены через переменные среды. например XAUTHORITY

Douglas Leeder 27.09.2008 17:10

@Roshan и @Douglas: DISPLAY =: 0.0 в crontab решили проблему. Я согласен с тем, что мог бы сделать это более легким подходом. Я экспериментировал с FireWatir, так что на данный момент это показалось мне полезным. Я попробую более легкий подход, когда у меня будет возможность. Еще раз спасибо.

rpattabi 27.09.2008 20:13

+1 - firefox --display =: 0.0 URL решил ту же проблему для меня ... спасибо.

deuberger 25.01.2011 18:16

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