Usando métodos de control de procesos Unix en Ruby
-
05-07-2019 - |
Pregunta
Ryan Tomayko provocó una gran tormenta de fuego con esta publicación sobre el uso del control de procesos de Unix comandos.
Deberíamos estar haciendo más de esto. Mucho más de esto. Estoy hablando de fork (2), execve (2), pipe (2), socketpair (2), select (2), kill (2), sigaction (2), y así sucesivamente. Estos son nuestros amigos. Ellos quieren tanto para ayudarnos.
Tengo un poco de código (un clon de delayed_job
para DataMapper que creo que encajaría con esto, pero no tengo claro cómo aprovechar los comandos listados. Cualquier idea ¿Cómo mejorar este código?
def start
say "*** Starting job worker #{@name}"
t = Thread.new do
loop do
delay = Update.work_off(self)
break if $exit
sleep delay
break if $exit
end
clear_locks
end
trap('TERM') { terminate_with t }
trap('INT') { terminate_with t }
trap('USR1') do
say "Wakeup Signal Caught"
t.run
end
end
Solución
Ahh sí ... los peligros de " Deberíamos hacer más de esto " sin explicar qué hace cada uno de ellos y en qué circunstancias los usarías. Para algo como delayed_job
puede incluso estar usando fork
sin saber que está utilizando fork
. Dicho esto, realmente no importa. Ryan estaba hablando sobre el uso de fork
para los servidores de preforking. delayed_job
usaría fork
para convertir un proceso en un demonio. La misma llamada al sistema, diferentes propósitos. Ejecutar delayed_job
en el primer plano (sin fork
) vs en segundo plano (con fork
) resultará en una diferencia de rendimiento insignificante.
Sin embargo, si escribes un servidor que acepta conexiones concurrentes, ahora el consejo de Ryan es acertado.
-
fork
: crea una copia del proceso original -
execve
: detiene la ejecución del archivo actual y comienza a ejecutar un nuevo archivo en el mismo proceso (muy útil en tareas de rake) -
pipe
: crea un conducto (dos descriptores de archivo, uno para leer y otro para escribir) -
socketpair
: como una tubería, pero para enchufes -
select
: vamos a esperar a que uno o más de los múltiples descriptores de archivos estén listos con un tiempo de espera -
kill
: se utiliza para enviar una señal a un proceso -
sigaction
: le permite cambiar lo que sucede cuando un proceso recibe una señal
Otros consejos
5 meses después, puede ver mi solución en http://github.com/antarestrader/Updater. Mira lib / updater / fork_worker.rb