parallel_run 0.1 → 0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
-