-
Notifications
You must be signed in to change notification settings - Fork 0
/
init.d.txt
242 lines (210 loc) · 5.93 KB
/
init.d.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
#! /bin/sh
### BEGIN INIT INFO
# Provides: app
# Required-Start: $local_fs $remote_fs $network $syslog
# Required-Stop: $local_fs $remote_fs $network $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: App
# Description: App
# 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_user="deploy"
app_folder="/home/$app_user/apps/app"
app_root="$app_folder/current"
pid_path="$app_root/tmp/pids"
socket_path="$app_root/tmp/sockets"
rails_socket="$socket_path/puma.sock"
web_server_pid_path="$pid_path/puma.pid"
web_server_config_file="$app_folder/shared/puma.rb"
shell_path="/bin/bash"
# Read configuration variable file if it is present
test -f /etc/default/app && . /etc/default/app
# 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 app 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
}
## Called when we have started the two processes and are waiting for their pid files.
wait_for_pids(){
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.
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
app_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'
app_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 no parts of the service is running, bail out.
exit_if_not_running(){
check_stale_pids
if [ "$web_status" != "0" ] ; then
echo "App is not running."
exit
fi
}
## Starts Puma if it's not running.
start_app() {
check_stale_pids
if [ "$web_status" != "0" ]; then
echo "Starting App Puma"
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 bundle e pumactl -F $web_server_config_file start
fi
# Wait for the pids to be planted
wait_for_pids
# Finally check the status to tell wether or not App is running
print_status
}
## Asks Puma if it would be so kind as to stop, if not kills it.
stop_app() {
exit_if_not_running
if [ "$web_status" = "0" ]; then
echo "Shutting down App Puma"
RAILS_ENV=$RAILS_ENV bundle exec pumactl -P $web_server_pid_path 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
print_status
}
## Prints the status of App and its components.
print_status() {
check_status
if [ "$web_status" != "0" ] ; then
echo "App is not running."
return
fi
if [ "$web_status" = "0" ]; then
echo "The App Puma web server with pid $wpid is running."
else
printf "The App Puma web server is \033[31mnot running\033[0m.\n"
fi
if [ "$web_status" = "0" ] ; then
printf "App and all its components are \033[32mup and running\033[0m.\n"
fi
}
## Tells ouma to reload its config
reload_app(){
exit_if_not_running
if [ "$wpid" = "0" ];then
echo "The App Puma Web server is not running thus its configuration can't be reloaded."
exit 1
fi
printf "Reloading App Puma configuration... "
# RAILS_ENV=$RAILS_ENV bin/web reload
RAILS_ENV=$RAILS_ENV bundle e pumactl -F $web_server_config_file reload
echo "Done."
wait_for_pids
print_status
}
## Restarts Puma.
restart_app(){
check_status
if [ "$web_status" = "0" ] ; then
stop_app
fi
start_app
}
### Finally the input handling.
case "$1" in
start)
start_app
;;
stop)
stop_app
;;
restart)
restart_app
;;
reload|force-reload)
reload_app
;;
status)
print_status
exit $app_status
;;
*)
echo "Usage: service app {start|stop|restart|reload|status}"
exit 1
;;
esac
exit