Я написал сценарий 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
Любая помощь приветствуется.

запись в crontab неверна
Это похоже на
#min hour day month dow user command
55 17 * * * ur_user_is_missing ruby /home/raguanu/Dropbox/nettie.rb >> /tmp/cron_test
@mana: Дуглас прав. Я мог бы нормально запускать задания cron без имени пользователя. Также, как вы видите в вопросе, я мог запустить задание cron. Просто я не видел firefox на дисплее.
Программы, запускаемые из 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
@Roshan и @Douglas: DISPLAY =: 0.0 в crontab решили проблему. Я согласен с тем, что мог бы сделать это более легким подходом. Я экспериментировал с FireWatir, так что на данный момент это показалось мне полезным. Я попробую более легкий подход, когда у меня будет возможность. Еще раз спасибо.
+1 - firefox --display =: 0.0 URL решил ту же проблему для меня ... спасибо.
Поле пользователя требуется только для системного crontab, а не для индивидуального crontab каждого пользователя.