Monit Ruby on Rails Sidekiq
Asked Answered
S

6

6

I'm trying to set up Monit for Sidekiq. Here's what I have so far for my config file:

 check process sidekiq_site
  with pidfile /var/www/site/tmp/pids/sidekiq.pid
  start program = "bundle exec sidekiq -C /var/www/site/config/sidekiq.yml -P /var/www/site/tmp/pids/sidekiq.pid" with timeout 90 seconds
  if totalmem is greater than 200 MB for 2 cycles then restart # eating up memory?
  group site_sidekiq

The problem is I'm getting a message when I run monit reload that the program "bundle" does not exist.

Does anyone have a solution for this?

Shoal answered 17/11, 2012 at 19:11 Comment(1)
Try to write full path to bundler, like /usr/local/lib/ruby/gems/1.9/gems/bundler-1.2.3/bin/bundle or even prefix that path with path to ruby. Use command which bundle to find full path.Tho
P
5

After working on my own monit and sidekiq config, I can share what worked for me running ubuntu.

First, there exists a sidekiq upstart script for ubuntu if you are on that distro. There are scripts for sidekiq and for managing the workers: https://github.com/mperham/sidekiq/tree/master/examples/upstart/manage-one

I ran into a few errors with that default upstart script, as I am using rvm. Checking /var/logs/upstart/sidekiq-0.log shed some light on the problems. This line:

exec bin/sidekiq -i ${index} -e production -C config/sidekiq.yml -P tmp/pids/sidekiq-${index}.pid

needed to be changed to exec bundle exec sidekiq + the options

Then, for keeping everything in line with my rvm install, I changed the following:

#source $HOME/.rvm/scripts/rvm
source /usr/local/rvm/scripts/rvm

In /etc/monit/monitrc I reference the upstart scripts and have:

# sidekiq
check process sidekiq
  with pidfile /var/www/apps/myapp/current/tmp/pids/sidekiq-0.pid
  start program = "/usr/bin/sudo start sidekiq index=0"
  stop program = "/usr/bin/sudo stop sidekiq index=0"
  if totalmem is greater than 500 MB for 2 cycles then restart # eating up memory?
  if 3 restarts within 5 cycles then timeout
Peruse answered 9/8, 2013 at 1:35 Comment(0)
U
4

check this: https://groups.google.com/forum/?fromgroups=#!topic/rubyversionmanager/0abB9jlqi_Y if you use rvm,

/bin/su - <username> -c 'bundle exec sidekiq -C /var/www/site/config/sidekiq.yml -P /var/www/site/tmp/pids/sidekiq.pid'

if you launch monit from user, set $HOME in your .bash_profile.

Or investigate whis answer: https://github.com/mperham/sidekiq/issues/506

Udder answered 29/11, 2012 at 8:27 Comment(0)
A
1

Here is a gist I wrote on github :

check process sidekiq_production with pidfile /var/run/sidekiq_production.pid
        depends on redis-server
        start program = "/etc/init.d/sidekiq_production start" with timeout 90 seconds
        stop program = "/etc/init.d/sidekiq_production stop" with timeout 90 seconds
        if totalmem is greater than 200 MB for 2 cycles then restart # eating up memory?
        if 2 restarts within 3 cycles then timeout

I wrote also an init script for sidekiq on Debian : https://gist.github.com/alain75007/5517948

Alek answered 4/5, 2013 at 16:36 Comment(0)
A
1

Finally this solution worked for me like charm :)

check process sidekiq with pidfile path_to_my_pid_file/sidekiq.pid

start program = "/bin/bash -c 'cd my_app_current && source /home/myuser/.rvm/environments/ruby-2.1.2@global && bundle exec sidekiq -e production -P path_to_my_pid_file/sidekiq.pid -L /my_shared_folder_path/log/sidekiq.log -C my_app_current/config/sidekiq.yml --daemon'" as uid "myuser" and gid "myuser"

stop program = "/bin/bash -c 'kill -s INT `cat path_to_my_pid_file/sidekiq.pid`'" as uid "myuser" and gid "myuser"

** Keep following points in mind:**

  • I am using RVM for ruby version management please check with rbenv.
  • Here you need to pass the global location of ruby the way I passed it here:- /home/myuser/.rvm/environments/ruby-2.1.2@global
Amalgam answered 29/9, 2015 at 9:29 Comment(0)
A
0

Your Problem is that the command bundle is missing. I think your should write the monit config file like that:

check process sidekiq 
  with pidfile /srv/www/projects/myapp/shared/log/production.sidekiq.pid
  start program = "/usr/bin/env /usr/bin/env HOME=/home/USER_NAME RACK_ENV=production RAILS_ENV=production PATH=/usr/local/bin:/usr/local/ruby/bin:/usr/bin:/bin:$PATH /bin/sh -l -c 'cd /srv/www/rails/myapp/current; bundle exec sidekiq'" as uid USER_NAME
  stop program = "/usr/bin/env /usr/bin/env HOME=/home/USER_NAME RACK_ENV=production RAILS_ENV=production PATH=/usr/local/bin:/usr/local/ruby/bin:/usr/bin:/bin:$PATH /bin/sh -l -c 'cd /
  group myapp_workers

If you walk into the apps directory and call bundle I think it work.

Allergy answered 13/2, 2014 at 9:38 Comment(0)
I
0

Here is the config that works on Ubuntu with rvm

check process sidekiq-th with pidfile /web/vcms/tmp/pids/sidekiq.pid
   start program = "/home/dimon/.rvm/bin/rvm-shell -c '/web/vcms/sidekiq.sh start'"
   stop program = "/bin/bash /web/vcms/sidekiq.sh stop &"   

It uses a script, the main lines are

start

cd /web/vcms; sidekiq -d -e production &

and stop

sidekiqctl stop $PIDFILE

I'm not a shell scripting guru and will be thankful for any advice =)

Indivertible answered 16/4, 2015 at 10:57 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.