我们正在使用rest-client向在我们的Elastic Beanstalk管理的EC2实例上启动as a process的Sidekiq工作人员发送外部API请求。
引擎盖下,当$(document).ready(function(){
$('#username').keyup(function(){
var username = $('#username').val();
$.ajax({
type:"POST",
url:"guild_find.php",
data:{username:username},
success:function(res){
$('#userslist').html(res);
}
});
});
});
失败时,客户端使用netrc和netrc calls Dir.pwd。我们看到此错误零星:
Dir.home
表示未设置Errno::ENOENT: No such file or directory - getcwd
[GEM_ROOT]/gems/netrc-0.10.3/lib/netrc.rb:26 :in `pwd`
,显然当前目录不再存在。一般情况下,我已在EB实例上设置ENV['HOME']
,我们已尝试通过HOME
进行设置,以确定。
问题是EB可能会出现这种情况,以及我们将来如何避免这种情况。我犹豫推测,但也许我们没有在部署之间正确地杀死Sidekiq进程并且旧的sidekiq进程存活,引用旧目录?我对EB还不是很熟悉;任何指导都会非常感激。
答案 0 :(得分:1)
我认为sidekiq api可能会帮助您调试此问题。
首先,从beanstalk进入rails console:/var/app/current
运行RAILS_ENV=production bundle exec rails c
然后require 'sidekiq/api'
如果您运行Sidekiq::Queue.new
,它将返回您排队的作业或Sidekiq::RetrySet.new
以查找计划重试的作业。如果您在上次部署之前已将旧作业排入队列,则应确认您对引用已删除目录的怀疑。
要安全关闭Sidekiq,您需要将USR1信号发送为 在您的部署过程中尽可能早,并且TERM信号为时已晚 尽可能。 USR1告诉Sidekiq停止拉新工作并完成 所有当前的工作。 TERM告诉Sidekiq在N秒内退出,其中N 由-t timeout选项设置,默认为8.使用USR1 + TERM 您的部署过程为您的工作提供了最长的时间 退出前完成。
你可以通过设置你的sidekiq工人只尝试一次然后死亡来避免这种情况。否则,您的工作人员将在25次重试或21天内继续失败。
class NonRetryableWorker
include Sidekiq::Worker
sidekiq_options retry: false
# your perform method
end
您还可以设置sidekiq_options retry: 5
或任何其他整数来明确设置重试次数。
如果您使用capistrano进行部署,则可以使用capistrano-sidekiq gem
管理部署之间的作业答案 1 :(得分:1)
正如在问题和答案中预示的那样,这是一个无法终止的流氓程序,在这种情况下,由于我们早期部署中的一个不小心的配置更改。我们sidekiq.config的第30行控制了进程数,我们从2减少到1,但在更改后没有从服务器手动删除第二个进程。
故事的寓意是,在部署期间,Sidekiq进程不会仅容易受到意外行为的影响。即使没有在多个部署中停止/启动,我们错误的流程也很乐意完成工作,但是依赖Dir.pwd
并且可能是任何其他需要ENV
数据的脚本的任何内容都将在天之后失败如果在持久进程上运行,则进行稳定部署。
如果您发现此类故障,绝对肯定您没有从先前部署中运行的意外进程。这意味着确保在部署as @JeffD23 mentioned期间正确终止它们,但也确保您没有在以前的部署中留下任何东西。
答案 2 :(得分:0)
我在你描述的场景中遇到了这个错误:
我们的一些后台工作人员未能停止部署,然后capistrano开始删除旧部署的目录。如果在旧的(现在已删除的)目录中启动的工作人员仍在,那么您所观察到的错误就会开始发生......
解决方案显然是为了确保在部署时正确终止旧进程...不幸的是我既不使用 EB 也不使用 Sidekiq ,所以我不能帮助你了解具体细节......
答案 3 :(得分:0)
我无法运行您的sidekiq.conf或0010_sidekiq.config(最接近您的配置)。我还不确定您是如何首次配置sidekiq的,也许您可以提供有关.ebextensions
和您的配置的更多详细信息。当我尝试使用您的配置时,我得到which sidekiq
行是错误:
<强> /var/log/eb-activity.log 强>
...
++ which bundle
+ BUNDLE=/opt/rubies/ruby-2.2.2/bin/bundle
++ which sidekiq
which: no sidekiq in (/opt/rubies/ruby-2.2.2/bin:/opt/elasticbeanstalk/lib/ruby/bin:/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/sbin:/sbin:/bin)
+ SIDEKIQ= (Executor::NonZeroExitStatus)
[2015-09-08T15:24:52.326Z] INFO [4963] - [Application update/AppDeployStage1/AppDeployPostHook/50_restart_sidekiq.sh] : Activity failed.
[2015-09-08T15:24:52.327Z] INFO [4963] - [Application update/AppDeployStage1/AppDeployPostHook] : Activity failed.
[2015-09-08T15:24:52.327Z] INFO [4963] - [Application update/AppDeployStage1] : Activity failed.
[2015-09-08T15:24:52.327Z] INFO [4963] - [Application update] : Completed activity. Result:
Application update - Command CMD-AppDeploy failed
但是,我正在使用其他.ebextensions
:https://github.com/jolks/ebextensions(注意:不要忘记将RAILS_ENV
设置为您的EB环境变量)。它运行正常。基本上,.ebextensions
尝试在部署应用程序后重新启动sidekiq。