杀死背景线程 - Ruby on Rails

时间:2018-01-31 22:05:00

标签: ruby-on-rails ruby

我创建了一个启动线程的模块,该模块会在5分钟内发送电子邮件。我通过运行一个rake任务启动线程,该任务加载到一个启动线程的模块中,如下所示:

require "#{Rails.root}/app/lib/Cron.rb"

namespace :cron_starter do
   desc "TODO"
   task start: :environment do
      Cron.run
   end

end

代码Cron.run调用我的模块方法,该方法启动运行无限循环的线程。所有这一切都很好,但如果我需要杀死线程该怎么办?有没有办法通过另一个rake任务附加到线程并杀死它?我总是可以写一个基本的txt文件并根据flag这样杀死它,但这看起来并不优雅。提前致谢。

更新

我试过

ps aux | grep cron_starter:start

我得到的输出是

root     11358  0.0  0.0  12944  1088 pts/0    S+   14:30   0:00 grep --color=auto cron_starter:start

我不确定是否有任何数字是进程ID,所以我试图运行

kill -9 11358

kill -9 12944

CLI以No such process

回复

更新2

我已尝试将Thread.current.object_id打印到日志文件中,我也试图从此ID中删除该线程,但我再次收到与上述相同的错误。

3 个答案:

答案 0 :(得分:1)

你可以这样做:

ps aux | grep #rake_task_name
kill -9 pid

答案 1 :(得分:0)

我会安装并使用sidekiq。它带有一个仪表板,您可以通过gem sidekiq-scheduler配置cron。然后,您可以从仪表板中安静或终止作业队列,这将停止发送电子邮件。老实说,如果你在ROR上有cron工作,你应该像sidekiq那样有一个活跃的工作分机。

Baring that,我确实会将pid写入文本文件并通过pid杀死。

答案 2 :(得分:0)

所以我终于明白了。问题是我发布了新的Thread而不是新的Process

我通过创建一个像这样的新流程解决了这个问题:

Process.fork do
   #my code here that loops forever
   logProcess(Process.pid) #this function is an external function that I created that writes the parameter to a file. 
   #you can use the id from Process.id to kill the process from the CLI.

end

您可以通过获取Process.id并运行

的值来终止该过程
kill -9 process_id_goes_here