Class: OsCtld::ContainerControl::Commands::Runscript::Runner
- Includes:
- Utils::Runscript::Runner
- Defined in:
- lib/osctld/container_control/commands/runscript.rb
Instance Attribute Summary
Attributes inherited from Runner
#ctid, #log_file, #lxc_home, #pool, #stderr, #stdin, #stdout, #user_home
Instance Method Summary collapse
-
#execute(mode, opts) ⇒ Integer
Exit status.
- #runscript_run_network(opts) ⇒ Object protected
- #runscript_running(opts) ⇒ Object protected
Methods included from Utils::Runscript::Runner
#osctld_wrapper_callback, #runscript_run, #with_configured_network
Methods inherited from Runner
#error, #initialize, #lxc_ct, #ok, #setup_exec_env, #setup_exec_run_env, #system_path
Constructor Details
This class inherits a constructor from OsCtld::ContainerControl::Runner
Instance Method Details
#execute(mode, opts) ⇒ Integer
Returns exit status.
108 109 110 |
# File 'lib/osctld/container_control/commands/runscript.rb', line 108 def execute(mode, opts) send(:"runscript_#{mode}", opts) end |
#runscript_run_network(opts) ⇒ Object (protected)
146 147 148 149 150 151 |
# File 'lib/osctld/container_control/commands/runscript.rb', line 146 def runscript_run_network(opts) with_configured_network( init_script: opts[:init_script], net_config: opts[:net_config] ) { runscript_running(opts) } end |
#runscript_running(opts) ⇒ Object (protected)
114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 |
# File 'lib/osctld/container_control/commands/runscript.rb', line 114 def runscript_running(opts) pid = lxc_ct.attach( stdin:, stdout:, stderr: ) do setup_exec_env ENV['HOME'] = '/root' ENV['USER'] = 'root' # FIXME: *something* must be keeping opts[:script] open, because when # runscript is run in parallel, 1-2 out of 10 calls fail with ETXTBSY, # which LXC translates to LXC::Error. So we try to call the script # multiple times, until *something* releases the file. last_error = nil 10.times do LXC.run_command([opts[:script]] + opts[:args]) last_error = nil break rescue LXC::Error => e last_error = e sleep(0.1) end raise last_error if last_error end _, status = Process.wait2(pid) ok(status.exitstatus) end |