firefox не открывается - cron, ruby, firewatir
-
02-07-2019 - |
Вопрос
Я написал скрипт 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