【发布时间】:2017-11-21 16:11:38
【问题描述】:
我正在一项作业中进行一些处理,最终执行外部 shell 命令。该命令正在执行一个需要数小时才能完成的脚本。
问题是,在我使用 spawn 和 detach 启动脚本后,如果我使用 kill -15 信号关闭 sidekiq 作业,脚本将停止执行。仅当 sidekiq 触发 spawn 命令时才会发生此行为 - 如果我在 irb 中执行此操作并关闭控制台,则不会发生此行为。所以不知何故,它似乎仍然绑定到 sidekiq - 但是为什么以及如何避免它呢?
test.sh
#!/bin/bash
for a in `seq 1000` ; do
echo "$a "
sleep 1
done
spawn_test_job.rb
module WorkerJobs
class SpawnTestJob < CountrySpecificWorker
sidekiq_options :queue => :my_jobs, :retry => false
def perform version
logfile = "/home/deployer/test_#{version}.log"
pid = spawn(
"cd /home/deployer &&
./test.sh
",
[:out, :err] => logfile
)
Process.detach(pid)
end
end
end
我将WorkerJobs::SpawnTestJob.perform_async(1) 的工作排入队列,如果我跟踪test_1.log,我可以看到我的计数器正在运行。但是,当我向 sidekiq 发送 kill -15 时,计数器停止并且脚本 pid 消失。
【问题讨论】:
-
我建议按照this answer 的流程图来确定在 Ruby 中触发和忘记子进程的最合适方法。
-
嘿@anothermh,非常棒的图表。谢谢分享。我正在根据它生成进程,但它不起作用。
标签: ruby-on-rails ruby sidekiq