Вместо того, чтобы порождать другой скрипт и хранить PID в базе данных, вы можете делать все это в одном скрипте, используя fork
и сохраняя PID в памяти. Вот пример сценария - вы добавляете и удаляете «рабочие экземпляры», набирая команды «add» и «del» в консоли, выходя с «quit»:
@pids = []
@counter = 0
def add_process
@pids.push(Process.fork {
loop do
puts "Hello from worker ##{@counter}"
sleep 1
end
})
@counter += 1
end
def del_process
return false if @pids.empty?
pid = @pids.pop
Process.kill('SIGTERM', pid)
true
end
def kill_all
while del_process
end
end
while cmd = gets.chomp
case cmd.downcase
when 'quit'
kill_all
exit
when 'add'
add_process
when 'del'
del_process
end
end
Конечно, это всего лишь пример, и для отправки команд и / или экземпляров мониторинга вы можете заменить этот простой цикл gets
небольшим приложением Sinatra, или интерфейсом сокета, или именованными каналами и т. Д.