Odroczone w czasie lub cykliczne wykonywanie zadań – proste narzędzia skryptowe

For English language version (Simple scheduler in Ruby) go here: http://wp.me/P3FRcu-d7

Dość często, zwłaszcza przy pozyskiwaniu danych z różnego rodzaju internetowych serwisów informacyjnych, których treść podlega dynamicznym zmianom, zachodzi potrzeba odroczonego w czasie lub cyklicznego wykonywania określonych zadań.

cronjob_crontabUżytkownicy systemów Unixowych oraz MacOS mogą w tym celu skorzystać z systemowych mechanizmów at lub crontab i to w większości sytuacji wystarcza. Wtedy czas wykonania zadań (bądź ich cykl) jest określony poza kodem skryptu. Gdybyśmy jednak chcieli go oprogramować w kodzie lub po prostu nie mieli z jakichś powodów dostępu do systemowych mechanizmów ‚schedulera’, wówczas z nieocenioną pomocą przychodzi język Ruby i biblioteka rufus-scheduler.

Skrypt, którego kod jest załączony do treści artykułu pokazuje kilka użytecznych rzeczy. Po pierwsze samego ‚schedulera’, którego możliwości w skrócie opisałem w komentarzach do skryptu. Po drugie, w jaki sposób zapisywać strony webowe do plików PDF, korzystając z biblioteki ‚pdfkit’. Oczywiście nic nie stoi na przeszkodzie, żeby zamiast tego zastosować inne formy przetwarzania uzyskanych rezultatów, jak choćby te, które opisałem we wcześniejszych artykułach o ‚data scrapingu’. Na przykład w jednym ze wspomnianych artykułów opisałem, jak automatycznie zaimportować rezultaty do arkusza kalkulacyjnego. Istnieje oczywiście i tym razem taka możliwość, a idąc dalej, tym sposobem można pokusić się nawet o jakąś zaawansowaną wizualizację danych. Po trzecie, w skrypcie została zaimplementowana obsługa sygnałów, by można w każdej chwili, w sposób ‚czysty’ przerwać działanie programu, na przykład kombinacją ctrl-c.

Jeśli zaś chodzi o to, co nasz skrypt konkretnie robi, to został on napisany w celu okresowego pobierania notowań spółek na warszawskiej giełdzie papierów wartościowych.

Polecam Wam dalszą modyfikację skryptu (i jednocześnie gorąco Was do tego namawiam), bo dziedzina jego zastosowań nie ogranicza się tylko do ‚data scrapingu’. Po kilku prostych modyfikacjach może być on z powodzeniem zastosowany w każdej sytuacji, gdzie wymagane jest odroczone wykonania zadań, w szczególności na przykład do badania czasów odpowiedzi sieci, sprawdzania dostępności usług sieciowych, weryfikowania zmian w routingu w sieciach, badania obciążenia urządzeń infrastruktury sieciowej itp.

Przed uruchomieniem skryptu nie zapomnijcie zainstalować odpowiednich bibliotek:

gem install open-uri
gem install rubygems
gem install rufus-scheduler
gem install pdfkit

Oto kod skryptu:

require 'open-uri'
require 'rubygems'
require 'rufus-scheduler'
require 'pdfkit'

# ----- Function to make a snapshot of web page saved to PDF file
def web2file(url, counter)
   site_image = PDFKit.new(url)
   site_image.to_file("notowania_#{counter}.pdf")
   puts "File saved: notowania_#{counter}.pdf"
end

# Signal handling 
trap "SIGINT" do
  puts "Exiting"
  exit
end

trap "SIGTERM" do
  puts "Exiting"
  exit
end

counter = 1

header =<<END
########################################################
# Simple scheduler to get Stock Quotes on Warsaw GPW   #
# by Janusz Nawrat - 2014                              #
# Results are saved to PDF files                       #
# See the code to customize scheduler to your needs    #
########################################################
END

puts header
begin
   scheduler = Rufus::Scheduler.new
   scheduler.every "1m" do
      web2file("http://www.parkiet.com/temat/1122373.html", counter)
      counter += 1
   end
   scheduler.join
   # Various forms of scheduling are supported:
   #
   # scheduler.in '10d' do
   # # do something in 10 days
   # end
   #
   # scheduler.at '2015/12/12 22:30:00' do
   # # do something at a given point in time
   # end
   #
   # scheduler.every '3h' do
   # # do something every 3 hours
   # end
   #
   # scheduler.cron '5 0 * * *' do
   # # do something every day, five minutes after midnight
   # # (see "crontab" documentation)
   # end
rescue => e
   STDERR.puts "An error occured: #{e}"
end

Informacje Janusz Nawrat
Just ordinary man who likes thinking...

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Log Out / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Log Out / Zmień )

Facebook photo

Komentujesz korzystając z konta Facebook. Log Out / Zmień )

Google+ photo

Komentujesz korzystając z konta Google+. Log Out / Zmień )

Connecting to %s

TOMASZ WEŁNA

artysta grafik | wykładowca

PRACOWNIA OKO

Szkoła Rysunku Malarstwa i Grafiki DR TOMASZA WEŁNY | KRAKÓW | Plac Matejki 10 | tel 691 81 75 74

Piękno neurobiologii

Blog Jerzego Vetulaniego

Teoria muzyki, zasady muzyki, podstawy muzyki

Teoria muzyki, zasady muzyki, podstawy muzyki - czyli to co każdy amator muzyki wiedzieć powinien :)

Personal Development & Inspirations

Przemyślenia i refleksje, którymi warto się podzielić (blog by Janusz Nawrat)

Business IT Cooperation Platform

Biznes i IT - dwa światy, które muszą współdziałać

%d bloggers like this: