如何停止多pool启动的delayed_job工作池中的单个Worker?
停止Delayed Job工作池中的单个Worker进程
要停止你启动的这个Delayed Job工作池里的单个Worker,有几种可靠的方法,具体看你的需求:
方法1:使用Delayed Job官方脚本(推荐)
Delayed Job的脚本本身支持针对特定编号的Worker进行停止操作。你只需要在命令里指定Worker的编号(对应pid文件名里的数字,比如delayed_job.0.pid对应的编号是0):
/usr/bin/env RAILS_ENV=production /var/www/project/current/script/delayed_job stop 0
这个命令会给目标Worker发送优雅终止信号,它会处理完当前正在执行的任务后再退出,避免任务丢失。
方法2:直接通过PID终止进程
如果你知道目标Worker的PID(可以从对应的pid文件里读取),也可以直接用kill命令发送终止信号:
# 先读取PID文件里的进程ID,再发送终止信号 kill $(cat /var/www/project/shared/tmp/pids/delayed_job.0.pid)
默认的kill命令发送的是TERM信号,同样会让Worker优雅退出。不要用kill -9强制终止,那样会导致正在处理的任务中断,可能引发数据不一致。
注意:配合Monit的额外操作
因为你用Monit监控这些Worker进程,直接停止Worker后,Monit可能会检测到进程消失,自动重启它。所以如果你希望Worker保持停止状态,需要先告诉Monit暂时停止监控这个进程:
monit stop delayed_job.0
等你需要重启这个Worker时,再用monit start delayed_job.0重新启动即可。
内容的提问来源于stack exchange,提问作者Robert Pankowecki
相关产品推荐
相关产品推荐

