Adoptable Cookbooks List

Looking for a cookbook to adopt? You can now see a list of cookbooks available for adoption!
List of Adoptable Cookbooks

Supermarket Belongs to the Community

Supermarket belongs to the community. While Chef has the responsibility to keep it running and be stewards of its functionality, what it does and how it works is driven by the community. The chef/supermarket repository will continue to be where development of the Supermarket application takes place. Come be part of shaping the direction of Supermarket by opening issues and pull requests or by joining us on the Chef Mailing List.

Select Badges

Select Supported Platforms

Select Status


rc_mon (5) Versions 0.1.0

A fabulous new cookbook

cookbook 'rc_mon', '= 0.1.0', :supermarket
cookbook 'rc_mon', '= 0.1.0'
knife supermarket install rc_mon
knife supermarket download rc_mon
Quality -%


RcMon is a simple process monitoring helper. It helps to ensure processes
stay up and that they are behaving properly. It's simple, straight forward,
and best of all lightweight.


The RcMon cookbook provides a definition to configure process monitoring. A
simple definition would look something like:

rc_mon_service 'memory_consumer' do
  memory_limit '200M'
  owner 'mem_tester'
  group 'mem_tester'

By default, RcMon uses runit, which means we'll need to provide templates for
the sv-run and sv-log-run files. We'll keep them simple:

# sv-memory_consumer-log-run.erb
exec svlogd -tt ./main
# sv-memory_consumer-run.erb
exec 2>&1
exec chpst /opt/memory_consumer

And some content for the memory consumer script so it actually does something
that needs monitoring:

file '/opt/memory_consumer' do
  content "#!#{node[:languages][:ruby][:ruby_bin]}
$a = ['this string was made for clonin']
while(true) do
  $a += $a * 5
  mode 0755

Now you can watch the process consume memory on the node, and once it has reached
the 200M threshold be killed and auto restarted.

$ watch -n 0.5 'ps -AH ux | grep memory_consumer | grep -v grep'

Under the hood

RcMon uses two tools under the hood. Runit is used to keep the process running
and cgroups are used to keep system resources under control. The rc_mon_service
definition is simply creating a new cgroup grouping, putting all processes with
the defined owner under that group, and creating a runit service for it. It's
just a shortcut for something that can be accomplished directly in a recipe
covering only memory restriction and cpu shares.

Note the owner attribute is extremely important. All processes run by the provided
owner will be moved under the created cgroup, so in general you'll want an
explicitly defined user for the process.

Using a different init

If you're using a different init, like upstart, and don't need/want runit to keep
the process alive, just use the no_runit argument:

rc_mon_service 'memory_consumer' do
  memory_limit '200M'
  owner 'mem_tester'
  group 'mem_tester'
  no_runit true

and if you want to prevent runit from even being loaded/installed, set
the attribute:

  • node[:rc_mon][:include_runit] = false


No quality metric results found