Elastic Beanstalk上的Sidekiq进程 - Errno :: ENOENT:没有这样的文件或目录 - getcwd

时间:2015-09-04 01:45:58

标签: ruby-on-rails amazon-web-services amazon-ec2 sidekiq amazon-elastic-beanstalk

我们正在使用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还不是很熟悉;任何指导都会非常感激。

4 个答案:

答案 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.conf0010_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

但是,我正在使用其他.ebextensionshttps://github.com/jolks/ebextensions(注意:不要忘记将RAILS_ENV设置为您的EB环境变量)。它运行正常。基本上,.ebextensions尝试在部署应用程序后重新启动sidekiq。