У меня есть этот рубиновый скрипт для управления процессами que. que не поддерживает мультипроцесс, см. обсуждение здесь):
#!/usr/bin/env ruby
cluster_size = 2
puts "starting Que cluster with #{cluster_size} workers"; STDOUT.flush
%w[INT TERM].each do |signal|
trap(signal) do
@pids.each{|pid| Process.kill(signal, pid) }
end
end
@pids = []
cluster_size.to_i.times do |n|
puts "Starting Que daemon #{n}"; STDOUT.flush
@pids << Process.spawn("que --worker-count $MAX_THREADS")
end
Process.waitall
puts "Que cluster has shut down"; STDOUT.flush
Сценарий работает уже пару месяцев. На днях я нашел вещи в состоянии, когда скрипт работал, но оба дочерних процесса были мертвы.
Я экспериментировал с попыткой воспроизвести это. Я убивал детей различными сигналами, если бы они делали исключения. Во всех случаях сценарий знал, что процесс умер и сам умер.
Как детский процесс мог погибнуть без знания родительского скрипта?