Usando Processo Unix Métodos de Controle em Ruby
-
05-07-2019 - |
Pergunta
Ryan Tomayko desencadeou um grande tempestade de fogo com este post sobre o uso de controle de processos Unix comandos.
Devemos fazer mais disso. Muito mais disto. Estou falando de fork (2), execve (2), tubo (2), socketpair (2), selecione (2), kill (2), sigaction (2), e assim por diante e assim por diante. Estes são nossos amigos. Eles querem tão mal apenas para nos ajudar.
Eu tenho um pouco de código (um clone delayed_job
para DataMapper que eu acho que se encaixaria bem com isso, mas eu não estou claro sobre como tirar proveito dos comandos listados. Todas as ideias sobre como melhorar esse 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
Solução
Ahh sim ... os perigos da "Devemos fazer mais desta" sem explicar o que cada um deles fazer e em que circunstâncias você usá-los. Para algo como delayed_job
você pode até estar usando fork
sem saber que você está usando fork
. Dito isto, realmente não importa. Ryan estava falando sobre o uso fork
para preforking servidores. delayed_job
usaria fork
para transformar um processo em um daemon. chamada de sistema mesmo, diferentes fins. Correndo delayed_job
em primeiro plano (sem fork
) vs no fundo (com fork
) irá resultar em uma diferença de desempenho insignificante.
No entanto, se você escrever um servidor que aceita conexões simultâneas, agora o conselho de Ryan está certo sobre o dinheiro.
-
fork
: cria uma cópia do processo original -
execve
: pára de executar o arquivo atual e começa a executar um novo arquivo no mesmo processo (muito útil em tarefas rake) -
pipe
: cria um pipe (dois descritores de arquivos, um para leitura, uma para escrever) -
socketpair
: como um tubo, mas para soquetes -
select
: Vamos você esperar por um ou mais dos vários descritores de arquivos para estar pronto com um tempo limite -
kill
: utilizado para enviar um sinal para um processo -
sigaction
: permite alterar o que acontece quando um processo recebe um sinal
Outras dicas
5 meses mais tarde, você pode ver a minha solução em http://github.com/antarestrader/Updater. Olhe para lib / updater / fork_worker.rb