Вы находитесь на странице: 1из 17

Ruby Non Web for Web

development

Stanislav O. Pogrebnyak
http://www.gera-it.com
*nix admin's best friends:

shell
perl
python
Ruby? Really?
Библиотека Daemons
http://daemons.rubyforge.org
Используется для создание демонов в *nix (start|stop|
restart|run)
Использует fork - можно отслеживать pid
Ведет логи, записывает весь stdout в файл
Легко интегрируется с monit, God и т.д.
> gem install daemons

В Windows работает только в режиме run


Пример использования
# "Демонизация" отдельного скрипта:

require 'rubygems'
require 'daemons'

Daemons.run('myserver.rb')

# "Демонизация" текущего процесса:

Daemons.daemonize # так плохо нет (start|stop)


Пример использования
# Использование в Rails:

require 'rubygems'
require 'daemons'

Dir.chdir(APP_DIR)
require File.join('config', 'environment')

Daemons.run_proc( “Actions runner” ) do


AllModels.do_all_actions
end
Пример использования
Запуск
> ruby my_daemon.rb start

Завершение
> ruby my_daemon.rb stop

Перезапуск
> ruby my_daemon.rb restart

Демон в режиме не демон(в Windows только


так )
> ruby my_daemon.rb run
Другие способы создания
процессов

RobustThreads

Daemon Kit

Looper

fork
rufus-scheduler планировщик

Позволяет запланировать выполнение кода

Поддерживает синтаксис cron

Не замена cron
rufus-scheduler примеры
require 'rubygems'
require 'rufus/scheduler'
scheduler = Rufus::Scheduler.start_new
scheduler.in '20m' do
puts "order ristretto"
end
scheduler.at 'Thu Mar 26 07:31:43 +0900 2009' do
puts 'order pizza'
end
scheduler.cron '0 22 * * 1-5' do
puts 'activate security system'
end
scheduler.every '5m' do
puts 'check blood pressure'
end
scheduler.join
Daemons + rufus-scheduler

Абстрагируемся от cron

Управляем из capistrano

Контролируем при помощи monit, God и т.д.

Пишем на Руби

Логируем состояния и сообщения в отдельные


файлы
Пример кода
require 'rubygems'
require 'daemons'
require 'rufus/scheduler'

Daemons.run_proc( "drink coffee scheduler" ) do


scheduler = Rufus::Scheduler.new
scheduler.start
scheduler.schedule_every "1h" do
puts "Its time to drink a cap of coffee or tea!"
end
scheduler.join
end
Ruby Networking
В руби есть библиотеки практически для всех
сетевых протоколов высокого уровня

Net::\
HTTP/HTTPs
FTP
SFTP
SSH
SCP
Net::HTTP(HTTPs)

Входит в стандартную библиотеку

Лежит в основе многих других библиотек и


программ

Реализует методы
HEAD/PUT/GET/POST/DELETE
Net::FTP
Входит в стандартную библиотеку

Очень похожа на утилиту ftp по принципам

Пример:

ftp = Net::FTP.new('ftp.netlab.co.jp')
ftp.login
files = ftp.list('n*')
ftp.getbinaryfile('nif.rb-0.91.gz', 'nif.gz', 1024)
ftp.close
Net::(SFTP/SCP/SSH)
http://net-ssh.rubyforge.org

Стек библиотек для организаций и


использования защищенных соединений

Net::SSH – выполнение приложений удаленно,


скачивание и закачивание файлов

Net::SCP – защищенное копирование файлов

Net::SFTP – FTP поверх Net::SSH


Net::(SFTP/SCP/SSH) заклинания:
require 'net/ssh'
Net::SSH.start( ‘google.com’, ‘larry’, :password => “love")
do |ssh|
ssh.exec!(“rm –rf ~/docs”)
ssh.exec (“cd ~/work && nohup ruby grab.rb”)
ssh.exec (“cd ~/work && nohup ruby download.rb”)
ssh.loop # курим пока все не выполнится
ssh.sftp.download!("/path/to/remote")
downloads = []
downloads << ssh.sftp.download("/path/to/remote2")
downloads << ssh.sftp.download("/path/to/remote3")
downloads << ssh.sftp.download("/path/to/remote4")
downloads.each{|d| d.wait} # курим
end
Вопросы?