parallel_run 0.1 → 0.2

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/Rakefile ADDED
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env rake
2
+ require "bundler/gem_tasks"
data/Readme.markdown CHANGED
@@ -0,0 +1,65 @@
1
+ # Parallel_run
2
+
3
+ ## Why ?
4
+
5
+ I often need to run a lot of commands in parallel. These commands can be slow (> 10 minutes), and have a very verbose output.
6
+ In case of error
7
+ * I don't known which command fails
8
+ * I cannot differentiate output of the differents commands
9
+ * I do not have any timestamp about command execution
10
+
11
+ `parallel_run` solve that !
12
+
13
+ ## How to use it
14
+
15
+ ### Installation
16
+
17
+ gem install parallel_run
18
+
19
+ ### Examples
20
+
21
+ Launch in parallel `echo a`, `echo b`, `echo c`
22
+
23
+ parallel_run --command "echo %v" a b c
24
+
25
+ Launch ruby tests in parallels
26
+
27
+ parallel_run --command "ruby -I. %v" tests/*.rb
28
+
29
+ Launch ruby tests in parallels and change line prefix to display only test name
30
+
31
+ parallel_run --command "ruby -I. %v" --prefix "%b" tests/*.rb
32
+
33
+ Launch full-upgrade on multiple servers in parallel
34
+
35
+ cat servers_list | xargs parallel_run --command "ssh root@%v aptitude full-upgrade -y"
36
+
37
+ Why can it be better than [pssh](http://www.theether.org/pssh/) ?
38
+ * `parallel_run` will display the list of failing servers at the end
39
+ * outputs are displayed in real time
40
+ * all outputs are in the console and can be easily analyzed in a Jenkins output
41
+
42
+ I can also use [capistrano](https://github.com/capistrano/capistrano/wiki), but it's more complicated to setup.
43
+
44
+ ### Exit code
45
+
46
+ `parallel_run` will return an exit code 0 only if all commands return an exit code of 0.
47
+
48
+ ## Options
49
+
50
+ $ parallel_run --help
51
+ Usage: parallel_run [options] values
52
+ -v, --verbose Output more information
53
+ -c, --command COMMAND Command to execute. You can use values (see below). Default value is '%v'.
54
+ -p, --prefix PREFIX Prefix for each line. You can use values (see below). Default value is '%v'.
55
+ -t, --time_format TIME_FORMAT Time format to use for each line. Default value is %H:%M:%S
56
+ --padding-size PADDING_SIZE Padding size for prefix. Default value is 20}
57
+ -h, --help Display this screen
58
+ Values can be used directly in command or prefix directly by using %v.
59
+ You can apply some function in values before using it :
60
+ * %v no function
61
+ * %b apply basename function
62
+ * %d apply dirname function
63
+ * %k return the index of value in command line values
64
+
65
+
data/lib/parallel_run.rb CHANGED
@@ -6,7 +6,7 @@ DEFAULT_TIME_FORMAT = "%H:%M:%S"
6
6
  DEFAULT_PADDING_SIZE = 20
7
7
 
8
8
  $options = {}
9
-
9
+
10
10
  optparse = OptionParser.new do|opts|
11
11
  opts.banner = "Usage: parallel_run [options] values"
12
12
 
@@ -35,6 +35,11 @@ optparse = OptionParser.new do|opts|
35
35
  $options[:padding_size] = c.to_i
36
36
  end
37
37
 
38
+ $options[:shell] = ENV['SHELL']
39
+ opts.on('--shell SHELL', "Shell to be used for launching command (default $SHELL)") do |c|
40
+ $options[:shell] = c
41
+ end
42
+
38
43
  opts.on('-h', '--help', 'Display this screen' ) do
39
44
  puts opts
40
45
  puts "Values can be used directly in command or prefix directly by using %v."
@@ -72,7 +77,8 @@ ARGV.each_with_index.to_a.peach do |f, index|
72
77
  c = replace $options[:command], f, index
73
78
  prefix = replace $options[:prefix], f, index
74
79
  output("Lauching command for #{f} : #{c}", prefix) if $options[:verbose]
75
- status = POpen4::popen4(c, 'r') do |stdout, stderr, stdin, pid|
80
+ full_cmd = "#{$options[:shell]} -c \"#{c.gsub(/"/, "\\\"")}\""
81
+ status = POpen4::popen4(full_cmd, 'r') do |stdout, stderr, stdin, pid|
76
82
  [stdout, stderr].peach do |io|
77
83
  flow = io == stderr ? "err" : "out"
78
84
  while !io.eof?
@@ -89,7 +95,9 @@ end
89
95
 
90
96
  ok = true
91
97
  result.each do |k, v|
92
- if v[:status].exitstatus != 0
98
+ if v[:status].nil?
99
+ output "Command failed : #{k} [#{v[:command]}] : unable to launch command", "master"
100
+ elsif v[:status].exitstatus != 0
93
101
  ok = false
94
102
  output "Command failed : #{k} [#{v[:command]}] : exit code #{v[:status].exitstatus}", "master"
95
103
  end
data/parallel_run.gemspec CHANGED
@@ -4,7 +4,7 @@ $:.push File.expand_path("../lib", __FILE__)
4
4
  Gem::Specification.new do |s|
5
5
 
6
6
  s.name = "parallel_run"
7
- s.version = "0.1"
7
+ s.version = "0.2"
8
8
  s.platform = Gem::Platform::RUBY
9
9
  s.authors = ["Bertrand Paquet"]
10
10
  s.email = ["bertrand.paquet@gmail.com"]
metadata CHANGED
@@ -1,100 +1,87 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: parallel_run
3
- version: !ruby/object:Gem::Version
4
- hash: 9
3
+ version: !ruby/object:Gem::Version
4
+ version: '0.2'
5
5
  prerelease:
6
- segments:
7
- - 0
8
- - 1
9
- version: "0.1"
10
6
  platform: ruby
11
- authors:
7
+ authors:
12
8
  - Bertrand Paquet
13
9
  autorequire:
14
10
  bindir: bin
15
11
  cert_chain: []
16
-
17
- date: 2012-06-02 00:00:00 Z
18
- dependencies:
19
- - !ruby/object:Gem::Dependency
12
+ date: 2013-02-21 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
20
15
  name: popen4
21
- prerelease: false
22
- requirement: &id001 !ruby/object:Gem::Requirement
16
+ requirement: !ruby/object:Gem::Requirement
23
17
  none: false
24
- requirements:
25
- - - ">="
26
- - !ruby/object:Gem::Version
27
- hash: 31
28
- segments:
29
- - 0
30
- - 1
31
- - 2
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
32
21
  version: 0.1.2
33
22
  type: :runtime
34
- version_requirements: *id001
35
- - !ruby/object:Gem::Dependency
36
- name: peach
37
23
  prerelease: false
38
- requirement: &id002 !ruby/object:Gem::Requirement
24
+ version_requirements: !ruby/object:Gem::Requirement
39
25
  none: false
40
- requirements:
41
- - - ">="
42
- - !ruby/object:Gem::Version
43
- hash: 3
44
- segments:
45
- - 0
46
- - 4
47
- version: "0.4"
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: 0.1.2
30
+ - !ruby/object:Gem::Dependency
31
+ name: peach
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0.4'
48
38
  type: :runtime
49
- version_requirements: *id002
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0.4'
50
46
  description: Launch shell commands in parallel, capturing stdout and stderr
51
- email:
47
+ email:
52
48
  - bertrand.paquet@gmail.com
53
- executables:
49
+ executables:
54
50
  - parallel_run
55
51
  extensions: []
56
-
57
- extra_rdoc_files:
52
+ extra_rdoc_files:
58
53
  - Readme.markdown
59
- files:
54
+ files:
55
+ - .gitignore
60
56
  - Gemfile
61
57
  - Gemfile.lock
58
+ - Rakefile
62
59
  - Readme.markdown
63
60
  - bin/parallel_run
64
61
  - lib/parallel_run.rb
65
62
  - parallel_run.gemspec
66
63
  homepage: http://github.com/bpaquet/parallel_run
67
64
  licenses: []
68
-
69
65
  post_install_message:
70
66
  rdoc_options: []
71
-
72
- require_paths:
67
+ require_paths:
73
68
  - lib
74
- required_ruby_version: !ruby/object:Gem::Requirement
69
+ required_ruby_version: !ruby/object:Gem::Requirement
75
70
  none: false
76
- requirements:
77
- - - ">="
78
- - !ruby/object:Gem::Version
79
- hash: 3
80
- segments:
81
- - 0
82
- version: "0"
83
- required_rubygems_version: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ! '>='
73
+ - !ruby/object:Gem::Version
74
+ version: '0'
75
+ required_rubygems_version: !ruby/object:Gem::Requirement
84
76
  none: false
85
- requirements:
86
- - - ">="
87
- - !ruby/object:Gem::Version
88
- hash: 3
89
- segments:
90
- - 0
91
- version: "0"
77
+ requirements:
78
+ - - ! '>='
79
+ - !ruby/object:Gem::Version
80
+ version: '0'
92
81
  requirements: []
93
-
94
82
  rubyforge_project:
95
- rubygems_version: 1.8.15
83
+ rubygems_version: 1.8.24
96
84
  signing_key:
97
85
  specification_version: 3
98
86
  summary: Launch shell commands in parallel, capturing stdout and stderr
99
87
  test_files: []
100
-