我创建了一个启动线程的模块,该模块会在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中删除该线程,但我再次收到与上述相同的错误。
答案 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