Sto cercando di generare un processo Ruby on Windows utilizzando qualcosa di simile:Spawned processo Ruby on di Windows muore quando guscio è terminata
p1 = spawn('ruby', 'loop.rb', [:out, :err] => ['process.log', "w"], :new_pgroup => true)
anche io quindi staccare dal processo tramite:
p1.detach
Questo dovrebbe capire, per quanto mi riguarda, creare un nuovo processo indipendente dal genitore. Sto persino usando il parametro new_pgroup per assicurarmi che il nuovo processo abbia il proprio gruppo di processi.
Quando eseguo il mio script, il processo secondario inizia e continua a funzionare. Anche l'esecuzione dello script che genera il processo secondario viene completata. Tuttavia, quando ora chiudo la shell, il processo secondario muore. Mi aspetto che continui a funzionare (funziona su OS X e Linux). Non riesco a capire se si tratta di un bug nel runtime di Ruby su Windows o se si tratta di una limitazione di Windows e di come gestisce i processi.
Per completezza il codice completo Rubino di quello che sto cercando di fare:
spawner.rb: può essere eseguito tramite ruby spawner.rb
e solo genera un nuovo sottoprocesso. Il processo creato è loop.rb che è solo un ciclo infinito. A seconda del sistema operativo, specifica un parametro diverso per la creazione del gruppo di processi.
require "tempfile"
require 'rbconfig'
class SpawnTest
def self.spawn_process
if os == :windows
p1 = spawn('ruby', 'loop.rb', [:out, :err] => ['process.log', "w"], :new_pgroup => true)
else
p1 = spawn('ruby', 'loop.rb', [:out, :err] => ['process.log', "w"], :pgroup => true)
end
# Detach from the processes so they will keep running
puts p1
Process.detach(p1)
end
def self.os
@os ||= (
host_os = RbConfig::CONFIG['host_os']
case host_os
when /mswin|msys|mingw|cygwin|bccwin|wince|emc/
:windows
when /darwin|mac os/
:macosx
when /linux/
:linux
when /solaris|bsd/
:unix
else
raise Error::WebDriverError, "unknown os: #{host_os.inspect}"
end
)
end
end
if __FILE__ == $0
SpawnTest.spawn_process
end
loop.rb
$stdout.sync = true
$stderr.sync = true
i = 0
while i < 10000
$stdout.puts "Iteration #{i}"
sleep 1
i = i + 1
end
$stdout.puts "Bye from #{Process.pid}"
ho trovato il win32-process gemma durante le mie indagini. Sembra che stia utilizzando le chiamate API win32 per generare processi. Qualcuno sa se questa libreria risolverebbe il problema?
Qualsiasi aiuto apprezzato.
Per quello che vale, la gemma del processo win32 risolve il mio problema. Usandolo, posso creare sotto processi su Windows che non muoiono quando chiudo il terminale. Non riesco ancora a capire se il problema riscontrato con Kernel.spawn su Windows sia dovuto a un bug, opzioni errate o qualche "funzione" sconosciuta di Windows. – Hardy
Puoi confermare che i processi generati vengono effettivamente creati in gruppi separati usando uno strumento come [Process Explorer] (https://technet.microsoft.com/en-us/sysinternals/processexplorer.aspx)? –
Immagino tu intenda il TaskManager !? Non riesco a visualizzare il PGID lì. Vedo solo l'ID del processo. Qualche idea su come ottenere il PGID per un processo in esecuzione su Windows? Ho provato con Cygwin e 'ps -W' e posso vedere il processo e una colonna per PGID, ma è praticamente '0' per tutti i processi a prescindere. Non penso che questo risultato sia affidabile. – Hardy