Created
September 28, 2013 21:59
-
-
Save spuder/6747146 to your computer and use it in GitHub Desktop.
A diff between the gitlab 6-0 init script and the gitlab 6-1 init script
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
root@gitlab:/home/git/gitlab# diff -bu /tmp/gitlab6-0 /tmp/gitlab6-1 > /tmp/git-ini-diff | |
root@gitlab:/home/git/gitlab# cat /tmp/git-ini-diff | |
--- /tmp/gitlab6-0 2013-09-28 21:55:12.927451102 +0000 | |
+++ /tmp/gitlab6-1 2013-09-28 21:54:55.500428709 +0000 | |
@@ -1,7 +1,8 @@ | |
-#! /bin/bash | |
+#! /bin/sh | |
# GITLAB | |
# Maintainer: @randx | |
+# Authors: [email protected], @randx | |
# App Version: 6.0 | |
### BEGIN INIT INFO | |
@@ -14,102 +15,227 @@ | |
# Description: GitLab git repository management | |
### END INIT INFO | |
+### Environment variables | |
+RAILS_ENV="production" | |
-APP_ROOT="/home/git/gitlab" | |
-APP_USER="git" | |
-DAEMON_OPTS="-c $APP_ROOT/config/unicorn.rb -E production" | |
-PID_PATH="$APP_ROOT/tmp/pids" | |
-SOCKET_PATH="$APP_ROOT/tmp/sockets" | |
-WEB_SERVER_PID="$PID_PATH/unicorn.pid" | |
-SIDEKIQ_PID="$PID_PATH/sidekiq.pid" | |
-STOP_SIDEKIQ="RAILS_ENV=production bundle exec rake sidekiq:stop" | |
-START_SIDEKIQ="RAILS_ENV=production bundle exec rake sidekiq:start" | |
-NAME="gitlab" | |
-DESC="GitLab service" | |
- | |
-check_pid(){ | |
- if [ -f $WEB_SERVER_PID ]; then | |
- PID=`cat $WEB_SERVER_PID` | |
- SPID=`cat $SIDEKIQ_PID` | |
- STATUS=`ps aux | grep $PID | grep -v grep | wc -l` | |
+# Script variable names should be lower-case not to conflict with internal | |
+# /bin/sh variables such as PATH, EDITOR or SHELL. | |
+app_root="/home/git/gitlab" | |
+app_user="git" | |
+unicorn_conf="$app_root/config/unicorn.rb" | |
+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" | |
+ | |
+ | |
+ | |
+### Here ends user configuration ### | |
+ | |
+ | |
+# 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, if it fails exit with an error. | |
+if ! cd "$app_root" ; then | |
+ echo "Failed to cd into $app_root, exiting!"; exit 1 | |
+fi | |
+ | |
+### Init Script functions | |
+ | |
+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 | |
- STATUS=0 | |
- PID=0 | |
+ wpid=0 | |
+ fi | |
+ if [ -f "$sidekiq_pid_path" ]; then | |
+ spid=$(cat "$sidekiq_pid_path") | |
+ else | |
+ spid=0 | |
fi | |
} | |
-execute() { | |
- sudo -u $APP_USER -H bash -l -c "$1" | |
+# 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 [ $spid -ne 0 ]; then | |
+ kill -0 "$spid" 2>/dev/null | |
+ sidekiq_status="$?" | |
+ else | |
+ sidekiq_status="-1" | |
+ fi | |
} | |
-start() { | |
- cd $APP_ROOT | |
- check_pid | |
- if [ "$PID" -ne 0 -a "$STATUS" -ne 0 ]; then | |
- # Program is running, exit with error code 1. | |
- echo "Error! $DESC $NAME is currently running!" | |
+# 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 [ "$spid" != "0" -a "$sidekiq_status" != "0" ]; then | |
+ echo "Removing stale Sidekiq web server pid. This is most likely caused by the Sidekiq crashing the last time it ran." | |
+ if ! rm "$sidekiq_pid_path"; then | |
+ echo "Unable to remove stale pid, exiting" | |
exit 1 | |
- else | |
- if [ `whoami` = root ]; then | |
- execute "rm -f $SOCKET_PATH/gitlab.socket" | |
- execute "RAILS_ENV=production bundle exec unicorn_rails $DAEMON_OPTS > /dev/null 2>&1 &" | |
- execute "mkdir -p $PID_PATH && $START_SIDEKIQ > /dev/null 2>&1 &" | |
- echo "$DESC started" | |
fi | |
fi | |
} | |
-stop() { | |
- cd $APP_ROOT | |
- check_pid | |
- if [ "$PID" -ne 0 -a "$STATUS" -ne 0 ]; then | |
- ## Program is running, stop it. | |
- kill -QUIT `cat $WEB_SERVER_PID` | |
- execute "mkdir -p $PID_PATH && $STOP_SIDEKIQ > /dev/null 2>&1 &" | |
- rm "$WEB_SERVER_PID" >> /dev/null | |
- echo "$DESC stopped" | |
+# If no parts of the service is running, bail out. | |
+exit_if_not_running(){ | |
+ check_stale_pids | |
+ if [ "$web_status" != "0" -a "$sidekiq_status" != "0" ]; then | |
+ echo "GitLab is not running." | |
+ exit | |
+ fi | |
+} | |
+ | |
+# Starts Unicorn and Sidekiq. | |
+start() { | |
+ check_stale_pids | |
+ | |
+ # Then check if the service is running. If it is: don't start again. | |
+ if [ "$web_status" = "0" ]; then | |
+ echo "The Unicorn web server already running with pid $wpid, not restarting." | |
else | |
- ## Program is not running, exit with error. | |
- echo "Error! $DESC not started!" | |
- exit 1 | |
+ echo "Starting the GitLab Unicorn web server..." | |
+ # Remove old socket if it exists | |
+ rm -f "$socket_path"/gitlab.socket 2>/dev/null | |
+ # Start the webserver | |
+ bundle exec unicorn_rails -D -c "$unicorn_conf" -E "$RAILS_ENV" | |
+ fi | |
+ | |
+ # If sidekiq is already running, don't start it again. | |
+ if [ "$sidekiq_status" = "0" ]; then | |
+ echo "The Sidekiq job dispatcher is already running with pid $spid, not restarting" | |
+ else | |
+ echo "Starting the GitLab Sidekiq event dispatcher..." | |
+ RAILS_ENV=$RAILS_ENV bundle exec rake sidekiq:start | |
+ # We are sleeping a bit here because sidekiq is slow at writing it's pid | |
+ sleep 2 | |
fi | |
+ | |
+ # Finally check the status to tell wether or not GitLab is running | |
+ status | |
} | |
-restart() { | |
- cd $APP_ROOT | |
- check_pid | |
- if [ "$PID" -ne 0 -a "$STATUS" -ne 0 ]; then | |
- echo "Restarting $DESC..." | |
- kill -USR2 `cat $WEB_SERVER_PID` | |
- execute "mkdir -p $PID_PATH && $STOP_SIDEKIQ > /dev/null 2>&1 &" | |
- if [ `whoami` = root ]; then | |
- execute "mkdir -p $PID_PATH && $START_SIDEKIQ > /dev/null 2>&1 &" | |
+# 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 the Unicorn web server is running, tell it to stop; | |
+ if [ "$web_status" = "0" ]; then | |
+ kill -QUIT "$wpid" & | |
+ echo "Stopping the GitLab Unicorn web server..." | |
+ stopping=true | |
+ else | |
+ echo "The Unicorn web was not running, doing nothing." | |
fi | |
- echo "$DESC restarted." | |
+ # And do the same thing for the Sidekiq. | |
+ if [ "$sidekiq_status" = "0" ]; then | |
+ printf "Stopping Sidekiq job dispatcher." | |
+ RAILS_ENV=$RAILS_ENV bundle exec rake sidekiq:stop & | |
+ stopping=true | |
else | |
- echo "Error, $NAME not running!" | |
- exit 1 | |
+ echo "The Sidekiq was not running, must have run out of breath." | |
+ fi | |
+ | |
+ | |
+ # If something needs to be stopped, lets wait for it to stop. Never use SIGKILL in a script. | |
+ while [ "$stopping" = "true" ]; do | |
+ sleep 1 | |
+ check_status | |
+ if [ "$web_status" = "0" -o "$sidekiq_status" = "0" ]; then | |
+ printf "." | |
+ else | |
+ 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. | |
+ | |
+ status | |
} | |
+# Returns the status of GitLab and it's components | |
status() { | |
- cd $APP_ROOT | |
- check_pid | |
- if [ "$PID" -ne 0 -a "$STATUS" -ne 0 ]; then | |
- echo "$DESC / Unicorn with PID $PID is running." | |
- echo "$DESC / Sidekiq with PID $SPID is running." | |
+ check_status | |
+ if [ "$web_status" != "0" -a "$sidekiq_status" != "0" ]; then | |
+ echo "GitLab is not running." | |
+ return | |
+ fi | |
+ if [ "$web_status" = "0" ]; then | |
+ echo "The GitLab Unicorn webserver with pid $wpid is running." | |
else | |
- echo "$DESC is not running." | |
- exit 1 | |
+ printf "The GitLab Unicorn webserver is \033[31mnot running\033[0m.\n" | |
+ fi | |
+ if [ "$sidekiq_status" = "0" ]; then | |
+ echo "The GitLab Sidekiq job dispatcher with pid $spid is running." | |
+ else | |
+ printf "The GitLab Sidekiq job dispatcher is \033[31mnot running\033[0m.\n" | |
+ fi | |
+ if [ "$web_status" = "0" -a "$sidekiq_status" = "0" ]; then | |
+ printf "GitLab and all it's components are \033[32mup and running\033[0m.\n" | |
fi | |
} | |
-## Check to see if we are running as root first. | |
-## Found at http://www.cyberciti.biz/tips/shell-root-user-check-script.html | |
-if [ "$(id -u)" != "0" ]; then | |
- echo "This script must be run as root" | |
+reload(){ | |
+ exit_if_not_running | |
+ if [ "$wpid" = "0" ];then | |
+ echo "The GitLab Unicorn Web server is not running thus its configuration can't be reloaded." | |
exit 1 | |
-fi | |
+ fi | |
+ printf "Reloading GitLab Unicorn configuration... " | |
+ kill -USR2 "$wpid" | |
+ echo "Done." | |
+ echo "Restarting GitLab Sidekiq since it isn't capable of reloading its config..." | |
+ RAILS_ENV=$RAILS_ENV bundle exec rake sidekiq:stop | |
+ echo "Starting Sidekiq..." | |
+ RAILS_ENV=$RAILS_ENV bundle exec rake sidekiq:start | |
+ # Waiting 2 seconds for sidekiq to write it. | |
+ sleep 2 | |
+ status | |
+} | |
+ | |
+restart(){ | |
+ check_status | |
+ if [ "$web_status" = "0" -o "$sidekiq_status" = "0" ]; then | |
+ stop | |
+ fi | |
+ start | |
+} | |
+ | |
+ | |
+## Finally the input handling. | |
case "$1" in | |
start) | |
@@ -122,17 +248,15 @@ | |
restart | |
;; | |
reload|force-reload) | |
- echo -n "Reloading $NAME configuration: " | |
- kill -HUP `cat $PID` | |
- echo "done." | |
+ reload | |
;; | |
status) | |
status | |
;; | |
*) | |
- echo "Usage: sudo service gitlab {start|stop|restart|reload}" >&2 | |
+ echo "Usage: service gitlab {start|stop|restart|reload|status}" | |
exit 1 | |
;; | |
esac | |
-exit 0 | |
+exit |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment