使用'RAILS_ENV =#{Rails.env} bundle exec使用fork调用脚本。 。 '不执行(Rails 2.1)

时间:2015-03-20 17:27:34

标签: ruby-on-rails ruby concurrency

相当深奥的问题,但对于我自己的启发,我很好奇这是怎么回事。

我在Rails 2.1上的遗留系统上运行的cron触发了一个脚本

它获取要执行的任务列表。由于每个任务可能都在长时间运行,因此它使用“fork”来处理任务。

我获取子进程的pid。 使用“RAILS_ENV = Rails.env bundle exec child_script”调用该进程不起作用。删除RAILS_ENV确实有效 (注意:直接从命令行运行子脚本就可以了。)

job_script_path = /path/to/child_script.rb
cmd = "RAILS_ENV=#{Rails.env} bundle exec #{job_script_path}
puts "Preparing to run #{cmd}"
ppid = fork{ system(cmd) }
puts "Fetched #{ppid} as parent process"

cpmd = "ps --ppid #{ppid}"
f = IO.popen(cpmd).readlines
puts "Output of #{cpmd}:"
puts "#{f}"

总是输出:

Preparing to run RAILS_ENV=development bundle exec /path/to/child_script.rb
Fetched 1234 as parent process
Output of ps --ppid 1234
PID TTY          TIME CMD

未列出任何流程。

如果我放弃RAILS_ENV =#{Rails.env}它运作正常。如何设置rails环境会强制原子性?

更新:这更像是一个Ruby问题。我在跑 。 。 。 。红宝石1.8.7

1 个答案:

答案 0 :(得分:0)

显然,您无法派生在Rails环境中运行的并发进程。但是,您可以分叉不依赖于Rails环境的并发进程。

#Do not prepend RAILS_ENV to this, it doesn't allow concurrency (for some reason.)
cmd = "bundle exec #{job.script_path}"
logger.info "Preparing to run #{cmd}"
ppid = fork{ system(cmd) }
logger.info "Fetched #{ppid} as parent process"

剥离Rails环境有效。我没有找到关于为什么会这样的确定资源。 Rails环境在某种程度上是单一的。