Merge branch 'unicorn-pgrp-term' into 'master'

Cleaner 'gitlab-ctl stop' for unicorn and logrotate

Both of these could leave a dangling 'sleep' process, especially
logrotate. We use a Runit 'control' script to intercept SIGTERM and
send it to the process group instead of the main process. Because
we use chpst -P, the main process is a process group leader so this
works.

I had to stick the logrotate 'run' script in a wrapper for this to
work.

See merge request !428
This commit is contained in:
Marin Jankovski 2015-08-17 10:25:04 +00:00
commit b692b82445
6 changed files with 39 additions and 7 deletions

View File

@ -86,6 +86,7 @@ define :unicorn_service, :rails_app => nil, :user => nil do
down node['gitlab'][svc]['ha']
restart_command 2 # Restart Unicorn using SIGUSR2
template_name 'unicorn'
control ['t']
options({
:service => svc,
:user => user,

View File

@ -46,6 +46,7 @@ end
runit_service "logrotate" do
down node['gitlab']['logrotate']['ha']
control ['t']
options({
:log_directory => logrotate_log_dir
}.merge(params))

View File

@ -0,0 +1,3 @@
#!/bin/sh
echo "Received TERM from runit, sending to process group (-PID)"
kill -- -$(cat /opt/gitlab/service/logrotate/supervise/pid)

View File

@ -3,10 +3,8 @@ exec 2>&1
cd <%= node['gitlab']['logrotate']['dir'] %>
# Sleep a bit to avoid going nuts after gitlab just started.
sleep <%= node['gitlab']['logrotate']['pre_sleep'] %>
nice /opt/gitlab/embedded/sbin/logrotate -s /var/log/gitlab/logrotate/logrotate.status logrotate.conf
# Sleep some more. After this, the script exits to be restarted by Runit.
sleep <%= node['gitlab']['logrotate']['post_sleep'] %>
exec /opt/gitlab/embedded/bin/chpst -P /usr/bin/env \
dir=<%= node['gitlab']['logrotate']['dir'] %> \
pre_sleep=<%= node['gitlab']['logrotate']['pre_sleep'] %> \
post_sleep=<%= node['gitlab']['logrotate']['post_sleep'] %> \
/opt/gitlab/embedded/bin/gitlab-logrotate-wrapper

View File

@ -0,0 +1,3 @@
#!/bin/sh
echo "Received TERM from runit, sending to process group (-PID)"
kill -- -$(cat /opt/gitlab/service/<%= @options[:service] %>/supervise/pid)

View File

@ -0,0 +1,26 @@
#!/bin/sh
main()
{
assert_non_empty pre_sleep
assert_non_empty post_sleep
assert_non_empty dir
# Sleep a bit to avoid going nuts after gitlab just started.
sleep ${pre_sleep}
nice /opt/gitlab/embedded/sbin/logrotate -s ${dir}/logrotate.status logrotate.conf
# Sleep some more. After this, the script exits to be restarted by Runit.
sleep ${post_sleep}
}
assert_non_empty()
{
if [ -z "$(eval echo \$$1)" ] ; then
echo "$0 error: \$$1 is empty"
exit 1
fi
}
main