Last active
April 25, 2017 02:33
-
-
Save icyleaf/b5d1a3048396072c5f5e5d196c8bc2db to your computer and use it in GitHub Desktop.
initd-template-for-rails
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
#!/bin/sh | |
cd $(dirname $0)/.. | |
app_root=$(pwd) | |
cd $app_root/.. | |
shared_root=$(pwd)/shared | |
cd $app_root | |
sidekiq_pidfile="$shared_root/tmp/pids/sidekiq-0.pid" | |
sidekiq_logfile="$shared_root/log/sidekiq.log" | |
qmobile_user=$(ls -l config.ru | awk '{print $3}') | |
sidekiq_cmd="bundle exec sidekiq --index 0 --pidfile $sidekiq_pidfile --environment $RAILS_ENV" | |
warn() | |
{ | |
echo "$@" 1>&2 | |
} | |
stop() | |
{ | |
exec bundle exec sidekiqctl stop $sidekiq_pidfile 10 >> $sidekiq_logfile 2>&1 | |
} | |
killall() | |
{ | |
pkill -u $qmobile_user -f 'sidekiq [0-9]' | |
} | |
restart() | |
{ | |
if [ -f $sidekiq_pidfile ]; then | |
stop | |
fi | |
killall | |
exec $sidekiq_cmd --logfile $sidekiq_logfile --daemon | |
} | |
start_no_daamonize() | |
{ | |
start_sidekiq >> $sidekiq_logfile 2>&1 | |
} | |
start_sidekiq() | |
{ | |
exec $sidekiq_cmd | |
} | |
load_ok() | |
{ | |
sidekiq_pid=$(cat $sidekiq_pidfile) | |
if [ -z "$sidekiq_pid" ] ; then | |
warn "Could not find a PID in $sidekiq_pidfile" | |
exit 0 | |
fi | |
if (ps -p $sidekiq_pid -o args | grep '\([0-9]\+\) of \1 busy' 1>&2) ; then | |
warn "Too many busy Sidekiq workers" | |
exit 1 | |
fi | |
exit 0 | |
} | |
case "$1" in | |
stop) | |
stop | |
;; | |
start) | |
restart | |
;; | |
start_no_daamonize) | |
start_no_daamonize | |
;; | |
start_foreground) | |
start_sidekiq | |
;; | |
restart) | |
restart | |
;; | |
killall) | |
killall | |
;; | |
load_ok) | |
load_ok | |
;; | |
*) | |
echo "Usage: RAILS_ENV=your_env $0 {stop|start|start_no_daamonize|restart|killall|load_ok}" | |
esac |
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
#! /bin/sh | |
# <Rails App Name> | |
# Maintainer: @icyleaf | |
# Authors: icyleaf.cn@gmail.com | |
### BEGIN INIT INFO | |
# Provides: <app_name> | |
# 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: <app short description> | |
# Description: <app description> | |
# chkconfig: - 85 14 | |
### END INIT INFO | |
### 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_name="rails" | |
app_user="icyleaf" | |
app_root="/home/$app_user/www/mobile/current" | |
shared_path="$app_root/../../shared" | |
pid_path="$shared_path/tmp/pids" | |
socket_path="$shared_path/tmp/sockets" | |
rails_socket="$socket_path/puma.socket" | |
web_server_pid_path="$pid_path/puma.pid" | |
sidekiq_pid_path="$pid_path/sidekiq-0.pid" | |
shell_path="/bin/bash" | |
# Switch to the app_user if it is not he/she who is running the script. | |
if [ `whoami` != "$app_user" ]; then | |
eval su - "$app_user" -c $(echo \")$shell_path -l -c \'$0 "$@"\'$(echo \"); 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 Puma pid: read it. | |
if [ -f "$web_server_pid_path" ]; then | |
wpid=$(cat "$web_server_pid_path") | |
else | |
wpid=0 | |
fi | |
if [ -f "$sidekiq_pid_path" ]; then | |
spid=$(cat "$sidekiq_pid_path") | |
else | |
spid=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 its pid | |
i=0; | |
while [ ! -f $web_server_pid_path ] || [ ! -f $sidekiq_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 its 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 | |
if [ $web_status = 0 ] && [ $sidekiq_status = 0 ]; then | |
services_status=0 | |
else | |
# http://refspecs.linuxbase.org/LSB_4.1.0/LSB-Core-generic/LSB-Core-generic/iniscrptact.html | |
# code 3 means 'program is not running' | |
servicese_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" ] && [ "$web_status" != "0" ]; then | |
echo "Removing stale Puma 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" ] && [ "$sidekiq_status" != "0" ]; then | |
echo "Removing stale Sidekiq job dispatcher pid. This is most likely caused by Sidekiq crashing the last time it ran." | |
if ! rm "$sidekiq_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" ] && [ "$sidekiq_status" != "0" ]; then | |
echo "Service is not running." | |
exit | |
fi | |
} | |
## Starts Puma and Sidekiq if they're not running. | |
start_services() { | |
check_stale_pids | |
if [ "$web_status" != "0" ]; then | |
echo "Starting Service Puma" | |
fi | |
if [ "$sidekiq_status" != "0" ]; then | |
echo "Starting Service Sidekiq" | |
fi | |
# Then check if the service is running. If it is: don't start again. | |
if [ "$web_status" = "0" ]; then | |
echo "The Puma web server already running with pid $wpid, not restarting." | |
else | |
# Remove old socket if it exists | |
rm -f "$rails_socket" 2>/dev/null | |
# Start the web server | |
RAILS_ENV=$RAILS_ENV bin/web start | |
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 | |
RAILS_ENV=$RAILS_ENV bin/background_jobs start & | |
fi | |
# Wait for the pids to be planted | |
wait_for_pids | |
# Finally check the status to tell wether or not Service is running | |
print_status | |
} | |
## Asks Puma, Sidekiq and MailRoom if they would be so kind as to stop, if not kills them. | |
stop_services() { | |
exit_if_not_running | |
if [ "$web_status" = "0" ]; then | |
echo "Shutting down Service Puma" | |
RAILS_ENV=$RAILS_ENV bin/web stop | |
fi | |
if [ "$sidekiq_status" = "0" ]; then | |
echo "Shutting down Service Sidekiq" | |
RAILS_ENV=$RAILS_ENV bin/background_jobs stop | |
fi | |
# If something needs to be stopped, lets wait for it to stop. Never use SIGKILL in a script. | |
while [ "$web_status" = "0" ] || [ "$sidekiq_status" = "0" ]; do | |
sleep 1 | |
check_status | |
printf "." | |
if [ "$web_status" != "0" ] && [ "$sidekiq_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" 2>/dev/null # Sidekiq seems to be cleaning up its own pid. | |
print_status | |
} | |
## Prints the status of Service and its components. | |
print_status() { | |
check_status | |
if [ "$web_status" != "0" ] && [ "$sidekiq_status" != "0" ]; then | |
echo "Service is not running." | |
return | |
fi | |
if [ "$web_status" = "0" ]; then | |
echo "The Service Puma web server with pid $wpid is running." | |
else | |
printf "The Service Puma web server is \033[31mnot running\033[0m.\n" | |
fi | |
if [ "$sidekiq_status" = "0" ]; then | |
echo "The Service Sidekiq job dispatcher with pid $spid is running." | |
else | |
printf "The Service Sidekiq job dispatcher is \033[31mnot running\033[0m.\n" | |
fi | |
if [ "$web_status" = "0" ] && [ "$sidekiq_status" = "0" ]; then | |
printf "Service and all its components are \033[32mup and running\033[0m.\n" | |
fi | |
} | |
## Tells puma to reload its config and Sidekiq to restart | |
reload_mobile(){ | |
exit_if_not_running | |
if [ "$wpid" = "0" ];then | |
echo "The Service Puma Web server is not running thus its configuration can't be reloaded." | |
exit 1 | |
fi | |
printf "Reloading Service Puma configuration... " | |
RAILS_ENV=$RAILS_ENV bin/web reload | |
echo "Done." | |
echo "Restarting Service Sidekiq since it isn't capable of reloading its config..." | |
RAILS_ENV=$RAILS_ENV bin/background_jobs restart | |
wait_for_pids | |
print_status | |
} | |
## Restarts Sidekiq and Puma. | |
restart_services(){ | |
check_status | |
if [ "$web_status" = "0" ] || [ "$sidekiq_status" = "0" ]; then | |
stop_services | |
fi | |
start_services | |
} | |
### Finally the input handling. | |
case "$1" in | |
start) | |
start_services | |
;; | |
stop) | |
stop_services | |
;; | |
restart) | |
restart_services | |
;; | |
reload|force-reload) | |
reload_services | |
;; | |
status) | |
print_status | |
exit $services_status | |
;; | |
*) | |
echo "Usage: service $app_name {start|stop|restart|reload|status}" | |
exit 1 | |
;; | |
esac | |
exit |
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
#!/bin/sh | |
cd $(dirname $0)/.. | |
app_root=$(pwd) | |
puma_pidfile="$app_root/../../shared/tmp/pids/puma.pid" | |
puma_config="$app_root/../../shared/puma.rb" | |
puma_cmd="bundle exec puma --config $puma_config --environment $RAILS_ENV" | |
get_puma_pid() | |
{ | |
local pid=$(cat $puma_pidfile) | |
if [ -z "$pid" ] ; then | |
echo "Could not find a PID in $puma_pidfile" | |
exit 1 | |
fi | |
puma_pid=$pid | |
} | |
start() | |
{ | |
exec $puma_cmd --daemon | |
} | |
start_foreground() | |
{ | |
exec $puma_cmd | |
} | |
stop() | |
{ | |
get_puma_pid | |
kill -QUIT $puma_pid | |
} | |
reload() | |
{ | |
get_puma_pid | |
kill -USR2 $puma_pid | |
} | |
case "$1" in | |
start) | |
start | |
;; | |
start_foreground) | |
start_foreground | |
;; | |
stop) | |
stop | |
;; | |
reload) | |
reload | |
;; | |
*) | |
echo "Usage: RAILS_ENV=your_env $0 {start|stop|reload}" | |
;; | |
esac |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment