RubyOnRails:如何终止卡住/失效的Resque Worker进程
终止特定Resque进程的脚本方案
方法一:基于Resque API的Ruby脚本
直接借助Resque内置API筛选并终止目标进程,无需解析外部命令,可靠性更高。
require 'resque' # 配置Resque Redis连接(与项目配置保持一致) Resque.redis = Redis.new(host: 'localhost', port: 6379, password: 'your_redis_password') # 获取所有运行中的worker workers = Resque.workers # 筛选运行时长超4小时的worker,取前2个 target_workers = workers.select do |worker| run_duration = Time.now - worker.started_at run_duration > 4 * 3600 # 4小时转换为秒 end.first(2) # 终止选中的worker target_workers.each do |worker| puts "终止进程: #{worker}" worker.terminate! # 优雅终止,需强制终止可替换为worker.kill! end
方法二:结合ps命令的Shell脚本
若无法运行Ruby脚本,可通过解析进程信息筛选并杀死目标进程:
#!/bin/bash # 筛选Resque进程,提取运行超4小时的前2个进程ID并终止 # 需根据实际情况调整进程标识(如下例中的"resque:worker") ps -eo pid,etimes,cmd | grep "resque:worker" | grep -v grep | awk '$2 > 14400' | sort -k2nr | head -2 | awk '{print $1}' | while read pid; do echo "终止进程ID: $pid" kill -TERM $pid # 优先尝试优雅终止,失败可替换为kill -9 $pid done
注意事项
- 确保脚本运行环境可访问Redis(Ruby脚本),或拥有执行
ps、kill命令的权限(Shell脚本)。 - 测试阶段可先移除终止相关代码,仅打印目标进程,确认无误后再执行终止操作。
- 若Resque worker有自定义进程标识,需调整筛选条件(如命令行中的队列名、任务名)。
内容的提问来源于stack exchange,提问作者RahulOnRails
相关产品推荐
相关产品推荐

