Switch to the app_user if it is not he/she who is running the script.
if [ "$USER" != "$app_user" ]; then
sudo -u "$app_user" -H -i $0 "$@"; exit;
fi
Switch to the gitlab path, exit on failure.
if ! cd "$app_root" ; then
echo "Failed to cd into $app_root, exiting!"; exit 1
fi
Init Script functions
Gets the pids from the files
check_pids(){
if ! mkdir -p "$pid_path"; then
echo "Could not create the path $pid_path needed to store the pids."
exit 1
fi
If there exists a file which should hold the value of the Unicorn pid: read it.
if [ -f "$web_server_pid_path" ]; then
wpid=$(cat "$web_server_pid_path")
else
wpid=0
fi
}
Called when we have started the two processes and are waiting for their pid files.
wait_for_pids(){
We are sleeping a bit here mostly because sidekiq is slow at writing it's pid
i=0;
while [ ! -f $web_server_pid_path ]; do
sleep 0.1;
i=$((i+1))
if [ $((i%10)) = 0 ]; then
echo -n "."
elif [ $((i)) = 301 ]; then
echo "Waited 30s for the processes to write their pids, something probably went wrong."
exit 1;
fi
done
echo
}
We use the pids in so many parts of the script it makes sense to always check them.
Only after start() is run should the pids change. Sidekiq sets it's own pid.
check_pids
Checks whether the different parts of the service are already running or not.
check_status(){
check_pids
If the web server is running kill -0 $wpid returns true, or rather 0.
Checks of *_status should only check for == 0 or != 0, never anything else.
if [ $wpid -ne 0 ]; then
kill -0 "$wpid" 2>/dev/null
web_status="$?"
else
web_status="-1"
fi
if [ $web_status = 0 ]; then
gitlab_status=0
else
# code 3 means 'program is not running'
gitlab_status=3
fi
}
Check for stale pids and remove them if necessary.
check_stale_pids(){
check_status
If there is a pid it is something else than 0, the service is running if
*_status is == 0.
if [ "$wpid" != "0" -a "$web_status" != "0" ]; then
echo "Removing stale Unicorn web server pid. This is most likely caused by the web server crashing the last time it ran."
if ! rm "$web_server_pid_path"; then
echo "Unable to remove stale pid, exiting."
exit 1
fi
fi
}
If no parts of the service is running, bail out.
exit_if_not_running(){
check_stale_pids
if [ "$web_status" != "0" ]; then
echo "TestcaseDB is not running."
exit
fi
}
Starts Unicorn and Sidekiq if they're not running.
start() {
check_stale_pids
if [ "$web_status" != "0" ]; then
echo -n "Starting TestcaseDB Unicorn "
fi
Then check if the service is running. If it is: don't start again.
if [ "$web_status" = "0" ]; then
echo "The TestcaseDB Unicorn web server already running with pid $wpid, not restarting."
else
Remove old socket if it exists
rm -f "$socket_path"/tcdb.socket 2>/dev/null
# Start the web server
RAILS_ENV=$RAILS_ENV script/web start &
fi
Wait for the pids to be planted
wait_for_pids
Finally check the status to tell wether or not GitLab is running
print_status
}
Asks the Unicorn and the Sidekiq if they would be so kind as to stop, if not kills them.
stop() {
exit_if_not_running
if [ "$web_status" = "0" ]; then
echo -n "Shutting down TestcaseDB Unicorn"
fi
If the Unicorn web server is running, tell it to stop;
if [ "$web_status" = "0" ]; then
RAILS_ENV=$RAILS_ENV script/web stop
fi
If something needs to be stopped, lets wait for it to stop. Never use SIGKILL in a script.
while [ "$web_status" = "0" ]; do
sleep 1
check_status
printf "."
if [ "$web_status" != "0" ]; then
printf "\n"
break
fi
done
sleep 1
Cleaning up unused pids
rm "$web_server_pid_path" 2>/dev/null
rm "$sidekiq_pid_path" # Sidekiq seems to be cleaning up it's own pid.
print_status
}
Prints the status of GitLab CI and it's components.
print_status() {
check_status
if [ "$web_status" = "0" ]; then
echo "The TestcaseDB Unicorn web server with pid $wpid is running."
else
printf "The TestcaseDB Unicorn web server is \033[31mnot running\033[0m.\n"
fi
}
Tells unicorn to reload it's config and Sidekiq to restart
reload(){
exit_if_not_running
if [ "$wpid" = "0" ];then
echo "The TestcaseDB Unicorn Web server is not running thus its configuration can't be reloaded."
exit 1
fi
printf "Reloading TestcaseDB Unicorn configuration... "
RAILS_ENV=$RAILS_ENV script/web reload
echo "Done."
wait_for_pids
print_status
}
Restarts Sidekiq and Unicorn.
restart(){
check_status
if [ "$web_status" = "0" ]; then
stop
fi
start
}
Finally the input handling.
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
reload|force-reload)
reload
;;
status)
print_status
exit $gitlab_status
;;
*)
echo "Usage: service tcdb {start|stop|restart|reload|status}"
exit 1
;;
esac
We have modified GitLab init script to run unicorn server. GitLab has included such scripts under the lib directory (https://github.com/gitlabhq/gitlabhq/tree/master/lib/support).
! /bin/sh
GITLAB CI
Maintainer: @randx
Authors: rovanion.luckey@gmail.com, @randx, @jvanbaarsen
BEGIN INIT INFO
Provides: gitlab-ci
Required-Start: $local_fs $remote_fs $network $syslog redis-server
Required-Stop: $local_fs $remote_fs $network $syslog
Default-Start: 2 3 4 5
Default-Stop: 0 1 6
Short-Description: GitLab CI
Description: GitLab CI
END INIT INFO
DO NOT EDIT THIS FILE!
This file will be overwritten on update.
Instead add/change your variables in /etc/default/gitlab-ci
An example defaults file can be found in lib/support/init.d/gitlab_ci.default.example
Environment variables
RAILS_ENV="production"
Script variable names should be lower-case not to conflict with
internal /bin/sh variables such as PATH, EDITOR or SHELL.
app_user="kiran" app_root="/home/$app_user/testcasedb" pid_path="$app_root/tmp/pids" socket_path="$app_root/tmp/sockets" web_server_pid_path="$pid_path/unicorn.pid"
sidekiq_pid_path="$pid_path/sidekiq.pid"
Read configuration variable file if it is present
test -f /etc/default/tcdb && . /etc/default/tcdb
Switch to the app_user if it is not he/she who is running the script.
if [ "$USER" != "$app_user" ]; then sudo -u "$app_user" -H -i $0 "$@"; exit; fi
Switch to the gitlab path, exit on failure.
if ! cd "$app_root" ; then echo "Failed to cd into $app_root, exiting!"; exit 1 fi
Init Script functions
Gets the pids from the files
check_pids(){ if ! mkdir -p "$pid_path"; then echo "Could not create the path $pid_path needed to store the pids." exit 1 fi
If there exists a file which should hold the value of the Unicorn pid: read it.
if [ -f "$web_server_pid_path" ]; then wpid=$(cat "$web_server_pid_path") else wpid=0 fi }
Called when we have started the two processes and are waiting for their pid files.
wait_for_pids(){
We are sleeping a bit here mostly because sidekiq is slow at writing it's pid
i=0; while [ ! -f $web_server_pid_path ]; do sleep 0.1; i=$((i+1)) if [ $((i%10)) = 0 ]; then echo -n "." elif [ $((i)) = 301 ]; then echo "Waited 30s for the processes to write their pids, something probably went wrong." exit 1; fi done echo }
We use the pids in so many parts of the script it makes sense to always check them.
Only after start() is run should the pids change. Sidekiq sets it's own pid.
check_pids
Checks whether the different parts of the service are already running or not.
check_status(){ check_pids
If the web server is running kill -0 $wpid returns true, or rather 0.
Checks of *_status should only check for == 0 or != 0, never anything else.
if [ $wpid -ne 0 ]; then kill -0 "$wpid" 2>/dev/null web_status="$?" else web_status="-1" fi if [ $web_status = 0 ]; then gitlab_status=0 else
http://refspecs.linuxbase.org/LSB_4.1.0/LSB-Core-generic/LSB-Core-generic/iniscrptact.html
fi }
Check for stale pids and remove them if necessary.
check_stale_pids(){ check_status
If there is a pid it is something else than 0, the service is running if
*_status is == 0.
if [ "$wpid" != "0" -a "$web_status" != "0" ]; then echo "Removing stale Unicorn web server pid. This is most likely caused by the web server crashing the last time it ran." if ! rm "$web_server_pid_path"; then echo "Unable to remove stale pid, exiting." exit 1 fi fi }
If no parts of the service is running, bail out.
exit_if_not_running(){ check_stale_pids if [ "$web_status" != "0" ]; then echo "TestcaseDB is not running." exit fi }
Starts Unicorn and Sidekiq if they're not running.
start() { check_stale_pids
if [ "$web_status" != "0" ]; then echo -n "Starting TestcaseDB Unicorn " fi
Then check if the service is running. If it is: don't start again.
if [ "$web_status" = "0" ]; then echo "The TestcaseDB Unicorn web server already running with pid $wpid, not restarting." else
Remove old socket if it exists
fi
Wait for the pids to be planted
wait_for_pids
Finally check the status to tell wether or not GitLab is running
print_status }
Asks the Unicorn and the Sidekiq if they would be so kind as to stop, if not kills them.
stop() { exit_if_not_running
if [ "$web_status" = "0" ]; then echo -n "Shutting down TestcaseDB Unicorn" fi
If the Unicorn web server is running, tell it to stop;
if [ "$web_status" = "0" ]; then RAILS_ENV=$RAILS_ENV script/web stop fi
If something needs to be stopped, lets wait for it to stop. Never use SIGKILL in a script.
while [ "$web_status" = "0" ]; do sleep 1 check_status printf "." if [ "$web_status" != "0" ]; then printf "\n" break fi done
sleep 1
Cleaning up unused pids
rm "$web_server_pid_path" 2>/dev/null
rm "$sidekiq_pid_path" # Sidekiq seems to be cleaning up it's own pid.
print_status }
Prints the status of GitLab CI and it's components.
print_status() { check_status if [ "$web_status" = "0" ]; then echo "The TestcaseDB Unicorn web server with pid $wpid is running." else printf "The TestcaseDB Unicorn web server is \033[31mnot running\033[0m.\n" fi }
Tells unicorn to reload it's config and Sidekiq to restart
reload(){ exit_if_not_running if [ "$wpid" = "0" ];then echo "The TestcaseDB Unicorn Web server is not running thus its configuration can't be reloaded." exit 1 fi printf "Reloading TestcaseDB Unicorn configuration... " RAILS_ENV=$RAILS_ENV script/web reload echo "Done."
wait_for_pids print_status }
Restarts Sidekiq and Unicorn.
restart(){ check_status if [ "$web_status" = "0" ]; then stop fi start }
Finally the input handling.
case "$1" in start) start ;; stop) stop ;; restart) restart ;; reload|force-reload) reload ;; status) print_status exit $gitlab_status ;; *) echo "Usage: service tcdb {start|stop|restart|reload|status}" exit 1 ;; esac
exit