This introduces new run_process() and screen_service() functions and sets the
groundwork to change how DevStack starts services. screen_service() is simply a
direct call to the screen portion of the old screen_it() function and is intended
to run commands that only need to run under screen, such as log file watchers.
run_process() is a replacement for screen_it() (which remains until all of the
services are updated). The usage is similar but requires updates to every current
screen_it() call to remove everything that requires the command to be interpreted
by a shell.
The old run_process() and _run_process() functions are still present as
old_run_process() and _old_run_process() to support the deprecated screen_it()
function. These will all go away in the future once all services have been
confirmed to have been changed over.
There is a similar new set of stop process functions stop_process() and
screen_stop_service(). The old screen_stop() will also remain for the deprecation
period.
As an initial test/demostration this review also includes the changes for
lib/cinder to demonstrate what is required for every service.
I included the scripts I used to test this; tests/fake-service.sh and
tests/run-process.sh are quite rough around the edges and may bite. They should
mature into productive members of the testing ecosystem someday.
Change-Id: I03322bf0208353ebd267811735c66f13a516637b
| ... | ... |
@@ -1135,8 +1135,8 @@ function zypper_install {
|
| 1135 | 1135 |
# fork. It includes the dirty work of closing extra filehandles and preparing log |
| 1136 | 1136 |
# files to produce the same logs as screen_it(). The log filename is derived |
| 1137 | 1137 |
# from the service name and global-and-now-misnamed ``SCREEN_LOGDIR`` |
| 1138 |
-# Uses globals ``CURRENT_LOG_TIME``, ``SCREEN_LOGDIR`` |
|
| 1139 |
-# _run_process service "command-line" |
|
| 1138 |
+# Uses globals ``CURRENT_LOG_TIME``, ``SCREEN_LOGDIR``, ``SCREEN_NAME``, ``SERVICE_DIR`` |
|
| 1139 |
+# _old_run_process service "command-line" |
|
| 1140 | 1140 |
function _run_process {
|
| 1141 | 1141 |
local service=$1 |
| 1142 | 1142 |
local command="$2" |
| ... | ... |
@@ -1155,8 +1155,12 @@ function _run_process {
|
| 1155 | 1155 |
export PYTHONUNBUFFERED=1 |
| 1156 | 1156 |
fi |
| 1157 | 1157 |
|
| 1158 |
- exec /bin/bash -c "$command" |
|
| 1159 |
- die "$service exec failure: $command" |
|
| 1158 |
+ # Run under ``setsid`` to force the process to become a session and group leader. |
|
| 1159 |
+ # The pid saved can be used with pkill -g to get the entire process group. |
|
| 1160 |
+ setsid $command & echo $! >$SERVICE_DIR/$SCREEN_NAME/$1.pid |
|
| 1161 |
+ |
|
| 1162 |
+ # Just silently exit this process |
|
| 1163 |
+ exit 0 |
|
| 1160 | 1164 |
} |
| 1161 | 1165 |
|
| 1162 | 1166 |
# Helper to remove the ``*.failure`` files under ``$SERVICE_DIR/$SCREEN_NAME``. |
| ... | ... |
@@ -1184,61 +1188,63 @@ function is_running {
|
| 1184 | 1184 |
return $exitcode |
| 1185 | 1185 |
} |
| 1186 | 1186 |
|
| 1187 |
-# run_process() launches a child process that closes all file descriptors and |
|
| 1188 |
-# then exec's the passed in command. This is meant to duplicate the semantics |
|
| 1189 |
-# of screen_it() without screen. PIDs are written to |
|
| 1190 |
-# ``$SERVICE_DIR/$SCREEN_NAME/$service.pid`` |
|
| 1187 |
+# Run a single service under screen or directly |
|
| 1188 |
+# If the command includes shell metachatacters (;<>*) it must be run using a shell |
|
| 1191 | 1189 |
# run_process service "command-line" |
| 1192 | 1190 |
function run_process {
|
| 1193 | 1191 |
local service=$1 |
| 1194 | 1192 |
local command="$2" |
| 1195 | 1193 |
|
| 1196 |
- # Spawn the child process |
|
| 1197 |
- _run_process "$service" "$command" & |
|
| 1198 |
- echo $! |
|
| 1194 |
+ if is_service_enabled $service; then |
|
| 1195 |
+ if [[ "$USE_SCREEN" = "True" ]]; then |
|
| 1196 |
+ screen_service "$service" "$command" |
|
| 1197 |
+ else |
|
| 1198 |
+ # Spawn directly without screen |
|
| 1199 |
+ _run_process "$service" "$command" & |
|
| 1200 |
+ fi |
|
| 1201 |
+ fi |
|
| 1199 | 1202 |
} |
| 1200 | 1203 |
|
| 1201 | 1204 |
# Helper to launch a service in a named screen |
| 1202 | 1205 |
# Uses globals ``CURRENT_LOG_TIME``, ``SCREEN_NAME``, ``SCREEN_LOGDIR``, |
| 1203 | 1206 |
# ``SERVICE_DIR``, ``USE_SCREEN`` |
| 1204 |
-# screen_it service "command-line" |
|
| 1205 |
-function screen_it {
|
|
| 1207 |
+# screen_service service "command-line" |
|
| 1208 |
+# Run a command in a shell in a screen window |
|
| 1209 |
+function screen_service {
|
|
| 1210 |
+ local service=$1 |
|
| 1211 |
+ local command="$2" |
|
| 1212 |
+ |
|
| 1206 | 1213 |
SCREEN_NAME=${SCREEN_NAME:-stack}
|
| 1207 | 1214 |
SERVICE_DIR=${SERVICE_DIR:-${DEST}/status}
|
| 1208 | 1215 |
USE_SCREEN=$(trueorfalse True $USE_SCREEN) |
| 1209 | 1216 |
|
| 1210 |
- if is_service_enabled $1; then |
|
| 1217 |
+ if is_service_enabled $service; then |
|
| 1211 | 1218 |
# Append the service to the screen rc file |
| 1212 |
- screen_rc "$1" "$2" |
|
| 1219 |
+ screen_rc "$service" "$command" |
|
| 1213 | 1220 |
|
| 1214 |
- if [[ "$USE_SCREEN" = "True" ]]; then |
|
| 1215 |
- screen -S $SCREEN_NAME -X screen -t $1 |
|
| 1216 |
- |
|
| 1217 |
- if [[ -n ${SCREEN_LOGDIR} ]]; then
|
|
| 1218 |
- screen -S $SCREEN_NAME -p $1 -X logfile ${SCREEN_LOGDIR}/screen-${1}.${CURRENT_LOG_TIME}.log
|
|
| 1219 |
- screen -S $SCREEN_NAME -p $1 -X log on |
|
| 1220 |
- ln -sf ${SCREEN_LOGDIR}/screen-${1}.${CURRENT_LOG_TIME}.log ${SCREEN_LOGDIR}/screen-${1}.log
|
|
| 1221 |
- fi |
|
| 1221 |
+ screen -S $SCREEN_NAME -X screen -t $service |
|
| 1222 | 1222 |
|
| 1223 |
- # sleep to allow bash to be ready to be send the command - we are |
|
| 1224 |
- # creating a new window in screen and then sends characters, so if |
|
| 1225 |
- # bash isn't running by the time we send the command, nothing happens |
|
| 1226 |
- sleep 3 |
|
| 1227 |
- |
|
| 1228 |
- NL=`echo -ne '\015'` |
|
| 1229 |
- # This fun command does the following: |
|
| 1230 |
- # - the passed server command is backgrounded |
|
| 1231 |
- # - the pid of the background process is saved in the usual place |
|
| 1232 |
- # - the server process is brought back to the foreground |
|
| 1233 |
- # - if the server process exits prematurely the fg command errors |
|
| 1234 |
- # and a message is written to stdout and the service failure file |
|
| 1235 |
- # The pid saved can be used in screen_stop() as a process group |
|
| 1236 |
- # id to kill off all child processes |
|
| 1237 |
- screen -S $SCREEN_NAME -p $1 -X stuff "$2 & echo \$! >$SERVICE_DIR/$SCREEN_NAME/$1.pid; fg || echo \"$1 failed to start\" | tee \"$SERVICE_DIR/$SCREEN_NAME/$1.failure\"$NL" |
|
| 1238 |
- else |
|
| 1239 |
- # Spawn directly without screen |
|
| 1240 |
- run_process "$1" "$2" >$SERVICE_DIR/$SCREEN_NAME/$1.pid |
|
| 1223 |
+ if [[ -n ${SCREEN_LOGDIR} ]]; then
|
|
| 1224 |
+ screen -S $SCREEN_NAME -p $service -X logfile ${SCREEN_LOGDIR}/screen-${service}.${CURRENT_LOG_TIME}.log
|
|
| 1225 |
+ screen -S $SCREEN_NAME -p $service -X log on |
|
| 1226 |
+ ln -sf ${SCREEN_LOGDIR}/screen-${service}.${CURRENT_LOG_TIME}.log ${SCREEN_LOGDIR}/screen-${service}.log
|
|
| 1241 | 1227 |
fi |
| 1228 |
+ |
|
| 1229 |
+ # sleep to allow bash to be ready to be send the command - we are |
|
| 1230 |
+ # creating a new window in screen and then sends characters, so if |
|
| 1231 |
+ # bash isn't running by the time we send the command, nothing happens |
|
| 1232 |
+ sleep 3 |
|
| 1233 |
+ |
|
| 1234 |
+ NL=`echo -ne '\015'` |
|
| 1235 |
+ # This fun command does the following: |
|
| 1236 |
+ # - the passed server command is backgrounded |
|
| 1237 |
+ # - the pid of the background process is saved in the usual place |
|
| 1238 |
+ # - the server process is brought back to the foreground |
|
| 1239 |
+ # - if the server process exits prematurely the fg command errors |
|
| 1240 |
+ # and a message is written to stdout and the service failure file |
|
| 1241 |
+ # The pid saved can be used in screen_stop() as a process group |
|
| 1242 |
+ # id to kill off all child processes |
|
| 1243 |
+ screen -S $SCREEN_NAME -p $service -X stuff "$command & echo \$! >$SERVICE_DIR/$SCREEN_NAME/${service}.pid; fg || echo \"$service failed to start\" | tee \"$SERVICE_DIR/$SCREEN_NAME/${service}.failure\"$NL"
|
|
| 1242 | 1244 |
fi |
| 1243 | 1245 |
} |
| 1244 | 1246 |
|
| ... | ... |
@@ -1276,20 +1282,40 @@ function screen_rc {
|
| 1276 | 1276 |
# that did not leave a PID behind |
| 1277 | 1277 |
# Uses globals ``SCREEN_NAME``, ``SERVICE_DIR``, ``USE_SCREEN`` |
| 1278 | 1278 |
# screen_stop service |
| 1279 |
-function screen_stop {
|
|
| 1279 |
+function screen_stop_service {
|
|
| 1280 |
+ local service=$1 |
|
| 1281 |
+ |
|
| 1280 | 1282 |
SCREEN_NAME=${SCREEN_NAME:-stack}
|
| 1281 | 1283 |
SERVICE_DIR=${SERVICE_DIR:-${DEST}/status}
|
| 1282 | 1284 |
USE_SCREEN=$(trueorfalse True $USE_SCREEN) |
| 1283 | 1285 |
|
| 1284 |
- if is_service_enabled $1; then |
|
| 1286 |
+ if is_service_enabled $service; then |
|
| 1287 |
+ # Clean up the screen window |
|
| 1288 |
+ screen -S $SCREEN_NAME -p $service -X kill |
|
| 1289 |
+ fi |
|
| 1290 |
+} |
|
| 1291 |
+ |
|
| 1292 |
+# Stop a service process |
|
| 1293 |
+# If a PID is available use it, kill the whole process group via TERM |
|
| 1294 |
+# If screen is being used kill the screen window; this will catch processes |
|
| 1295 |
+# that did not leave a PID behind |
|
| 1296 |
+# Uses globals ``SERVICE_DIR``, ``USE_SCREEN`` |
|
| 1297 |
+# stop_process service |
|
| 1298 |
+function stop_process {
|
|
| 1299 |
+ local service=$1 |
|
| 1300 |
+ |
|
| 1301 |
+ SERVICE_DIR=${SERVICE_DIR:-${DEST}/status}
|
|
| 1302 |
+ USE_SCREEN=$(trueorfalse True $USE_SCREEN) |
|
| 1303 |
+ |
|
| 1304 |
+ if is_service_enabled $service; then |
|
| 1285 | 1305 |
# Kill via pid if we have one available |
| 1286 |
- if [[ -r $SERVICE_DIR/$SCREEN_NAME/$1.pid ]]; then |
|
| 1287 |
- pkill -TERM -P -$(cat $SERVICE_DIR/$SCREEN_NAME/$1.pid) |
|
| 1288 |
- rm $SERVICE_DIR/$SCREEN_NAME/$1.pid |
|
| 1306 |
+ if [[ -r $SERVICE_DIR/$SCREEN_NAME/$service.pid ]]; then |
|
| 1307 |
+ pkill -g $(cat $SERVICE_DIR/$SCREEN_NAME/$service.pid) |
|
| 1308 |
+ rm $SERVICE_DIR/$SCREEN_NAME/$service.pid |
|
| 1289 | 1309 |
fi |
| 1290 | 1310 |
if [[ "$USE_SCREEN" = "True" ]]; then |
| 1291 | 1311 |
# Clean up the screen window |
| 1292 |
- screen -S $SCREEN_NAME -p $1 -X kill |
|
| 1312 |
+ screen_stop_service $service |
|
| 1293 | 1313 |
fi |
| 1294 | 1314 |
fi |
| 1295 | 1315 |
} |
| ... | ... |
@@ -1325,6 +1351,80 @@ function service_check {
|
| 1325 | 1325 |
} |
| 1326 | 1326 |
|
| 1327 | 1327 |
|
| 1328 |
+# Deprecated Functions |
|
| 1329 |
+# -------------------- |
|
| 1330 |
+ |
|
| 1331 |
+# _old_run_process() is designed to be backgrounded by old_run_process() to simulate a |
|
| 1332 |
+# fork. It includes the dirty work of closing extra filehandles and preparing log |
|
| 1333 |
+# files to produce the same logs as screen_it(). The log filename is derived |
|
| 1334 |
+# from the service name and global-and-now-misnamed ``SCREEN_LOGDIR`` |
|
| 1335 |
+# Uses globals ``CURRENT_LOG_TIME``, ``SCREEN_LOGDIR``, ``SCREEN_NAME``, ``SERVICE_DIR`` |
|
| 1336 |
+# _old_run_process service "command-line" |
|
| 1337 |
+function _old_run_process {
|
|
| 1338 |
+ local service=$1 |
|
| 1339 |
+ local command="$2" |
|
| 1340 |
+ |
|
| 1341 |
+ # Undo logging redirections and close the extra descriptors |
|
| 1342 |
+ exec 1>&3 |
|
| 1343 |
+ exec 2>&3 |
|
| 1344 |
+ exec 3>&- |
|
| 1345 |
+ exec 6>&- |
|
| 1346 |
+ |
|
| 1347 |
+ if [[ -n ${SCREEN_LOGDIR} ]]; then
|
|
| 1348 |
+ exec 1>&${SCREEN_LOGDIR}/screen-${1}.${CURRENT_LOG_TIME}.log 2>&1
|
|
| 1349 |
+ ln -sf ${SCREEN_LOGDIR}/screen-${1}.${CURRENT_LOG_TIME}.log ${SCREEN_LOGDIR}/screen-${1}.log
|
|
| 1350 |
+ |
|
| 1351 |
+ # TODO(dtroyer): Hack to get stdout from the Python interpreter for the logs. |
|
| 1352 |
+ export PYTHONUNBUFFERED=1 |
|
| 1353 |
+ fi |
|
| 1354 |
+ |
|
| 1355 |
+ exec /bin/bash -c "$command" |
|
| 1356 |
+ die "$service exec failure: $command" |
|
| 1357 |
+} |
|
| 1358 |
+ |
|
| 1359 |
+# old_run_process() launches a child process that closes all file descriptors and |
|
| 1360 |
+# then exec's the passed in command. This is meant to duplicate the semantics |
|
| 1361 |
+# of screen_it() without screen. PIDs are written to |
|
| 1362 |
+# ``$SERVICE_DIR/$SCREEN_NAME/$service.pid`` by the spawned child process. |
|
| 1363 |
+# old_run_process service "command-line" |
|
| 1364 |
+function old_run_process {
|
|
| 1365 |
+ local service=$1 |
|
| 1366 |
+ local command="$2" |
|
| 1367 |
+ |
|
| 1368 |
+ # Spawn the child process |
|
| 1369 |
+ _old_run_process "$service" "$command" & |
|
| 1370 |
+ echo $! |
|
| 1371 |
+} |
|
| 1372 |
+ |
|
| 1373 |
+# Compatibility for existing start_XXXX() functions |
|
| 1374 |
+# Uses global ``USE_SCREEN`` |
|
| 1375 |
+# screen_it service "command-line" |
|
| 1376 |
+function screen_it {
|
|
| 1377 |
+ if is_service_enabled $1; then |
|
| 1378 |
+ # Append the service to the screen rc file |
|
| 1379 |
+ screen_rc "$1" "$2" |
|
| 1380 |
+ |
|
| 1381 |
+ if [[ "$USE_SCREEN" = "True" ]]; then |
|
| 1382 |
+ screen_service "$1" "$2" |
|
| 1383 |
+ else |
|
| 1384 |
+ # Spawn directly without screen |
|
| 1385 |
+ old_run_process "$1" "$2" >$SERVICE_DIR/$SCREEN_NAME/$1.pid |
|
| 1386 |
+ fi |
|
| 1387 |
+ fi |
|
| 1388 |
+} |
|
| 1389 |
+ |
|
| 1390 |
+# Compatibility for existing stop_XXXX() functions |
|
| 1391 |
+# Stop a service in screen |
|
| 1392 |
+# If a PID is available use it, kill the whole process group via TERM |
|
| 1393 |
+# If screen is being used kill the screen window; this will catch processes |
|
| 1394 |
+# that did not leave a PID behind |
|
| 1395 |
+# screen_stop service |
|
| 1396 |
+function screen_stop {
|
|
| 1397 |
+ # Clean up the screen window |
|
| 1398 |
+ stop_process $1 |
|
| 1399 |
+} |
|
| 1400 |
+ |
|
| 1401 |
+ |
|
| 1328 | 1402 |
# Python Functions |
| 1329 | 1403 |
# ================ |
| 1330 | 1404 |
|
| ... | ... |
@@ -431,15 +431,15 @@ function start_cinder {
|
| 431 | 431 |
sudo tgtadm --mode system --op update --name debug --value on |
| 432 | 432 |
fi |
| 433 | 433 |
|
| 434 |
- screen_it c-api "cd $CINDER_DIR && $CINDER_BIN_DIR/cinder-api --config-file $CINDER_CONF" |
|
| 434 |
+ run_process c-api "$CINDER_BIN_DIR/cinder-api --config-file $CINDER_CONF" |
|
| 435 | 435 |
echo "Waiting for Cinder API to start..." |
| 436 | 436 |
if ! wait_for_service $SERVICE_TIMEOUT $CINDER_SERVICE_PROTOCOL://$CINDER_SERVICE_HOST:$CINDER_SERVICE_PORT; then |
| 437 | 437 |
die $LINENO "c-api did not start" |
| 438 | 438 |
fi |
| 439 | 439 |
|
| 440 |
- screen_it c-sch "cd $CINDER_DIR && $CINDER_BIN_DIR/cinder-scheduler --config-file $CINDER_CONF" |
|
| 441 |
- screen_it c-bak "cd $CINDER_DIR && $CINDER_BIN_DIR/cinder-backup --config-file $CINDER_CONF" |
|
| 442 |
- screen_it c-vol "cd $CINDER_DIR && $CINDER_BIN_DIR/cinder-volume --config-file $CINDER_CONF" |
|
| 440 |
+ run_process c-sch "$CINDER_BIN_DIR/cinder-scheduler --config-file $CINDER_CONF" |
|
| 441 |
+ run_process c-bak "$CINDER_BIN_DIR/cinder-backup --config-file $CINDER_CONF" |
|
| 442 |
+ run_process c-vol "$CINDER_BIN_DIR/cinder-volume --config-file $CINDER_CONF" |
|
| 443 | 443 |
|
| 444 | 444 |
# NOTE(jdg): For cinder, startup order matters. To ensure that repor_capabilities is received |
| 445 | 445 |
# by the scheduler start the cinder-volume service last (or restart it) after the scheduler |
| 446 | 446 |
new file mode 100755 |
| ... | ... |
@@ -0,0 +1,19 @@ |
| 0 |
+#!/bin/bash |
|
| 1 |
+# fake-service.sh - a fake service for start/stop testing |
|
| 2 |
+# $1 - sleep time |
|
| 3 |
+ |
|
| 4 |
+SLEEP_TIME=${1:-3}
|
|
| 5 |
+ |
|
| 6 |
+LOG=/tmp/fake-service.log |
|
| 7 |
+TIMESTAMP_FORMAT=${TIMESTAMP_FORMAT:-"%F-%H%M%S"}
|
|
| 8 |
+ |
|
| 9 |
+# duplicate output |
|
| 10 |
+exec 1> >(tee -a ${LOG})
|
|
| 11 |
+ |
|
| 12 |
+echo "" |
|
| 13 |
+echo "Starting fake-service for ${SLEEP_TIME}"
|
|
| 14 |
+while true; do |
|
| 15 |
+ echo "$(date +${TIMESTAMP_FORMAT}) [$$]"
|
|
| 16 |
+ sleep ${SLEEP_TIME}
|
|
| 17 |
+done |
|
| 18 |
+ |
| 0 | 19 |
new file mode 100755 |
| ... | ... |
@@ -0,0 +1,109 @@ |
| 0 |
+#!/bin/bash |
|
| 1 |
+# tests/exec.sh - Test DevStack screen_it() and screen_stop() |
|
| 2 |
+# |
|
| 3 |
+# exec.sh start|stop|status |
|
| 4 |
+# |
|
| 5 |
+# Set USE_SCREEN to change the default |
|
| 6 |
+# |
|
| 7 |
+# This script emulates the basic exec envirnment in ``stack.sh`` to test |
|
| 8 |
+# the process spawn and kill operations. |
|
| 9 |
+ |
|
| 10 |
+if [[ -z $1 ]]; then |
|
| 11 |
+ echo "$0 start|stop" |
|
| 12 |
+ exit 1 |
|
| 13 |
+fi |
|
| 14 |
+ |
|
| 15 |
+TOP_DIR=$(cd $(dirname "$0")/.. && pwd) |
|
| 16 |
+source $TOP_DIR/functions |
|
| 17 |
+ |
|
| 18 |
+USE_SCREEN=${USE_SCREEN:-False}
|
|
| 19 |
+ |
|
| 20 |
+ENABLED_SERVICES=fake-service |
|
| 21 |
+ |
|
| 22 |
+SERVICE_DIR=/tmp |
|
| 23 |
+SCREEN_NAME=test |
|
| 24 |
+SCREEN_LOGDIR=${SERVICE_DIR}/${SCREEN_NAME}
|
|
| 25 |
+ |
|
| 26 |
+ |
|
| 27 |
+# Kill background processes on exit |
|
| 28 |
+trap clean EXIT |
|
| 29 |
+clean() {
|
|
| 30 |
+ local r=$? |
|
| 31 |
+ jobs -p |
|
| 32 |
+ kill >/dev/null 2>&1 $(jobs -p) |
|
| 33 |
+ exit $r |
|
| 34 |
+} |
|
| 35 |
+ |
|
| 36 |
+ |
|
| 37 |
+# Exit on any errors so that errors don't compound |
|
| 38 |
+trap failed ERR |
|
| 39 |
+failed() {
|
|
| 40 |
+ local r=$? |
|
| 41 |
+ jobs -p |
|
| 42 |
+ kill >/dev/null 2>&1 $(jobs -p) |
|
| 43 |
+ set +o xtrace |
|
| 44 |
+ [ -n "$LOGFILE" ] && echo "${0##*/} failed: full log in $LOGFILE"
|
|
| 45 |
+ exit $r |
|
| 46 |
+} |
|
| 47 |
+ |
|
| 48 |
+function status {
|
|
| 49 |
+ if [[ -r $SERVICE_DIR/$SCREEN_NAME/fake-service.pid ]]; then |
|
| 50 |
+ pstree -pg $(cat $SERVICE_DIR/$SCREEN_NAME/fake-service.pid) |
|
| 51 |
+ fi |
|
| 52 |
+ ps -ef | grep fake |
|
| 53 |
+} |
|
| 54 |
+ |
|
| 55 |
+function setup_screen {
|
|
| 56 |
+if [[ ! -d $SERVICE_DIR/$SCREEN_NAME ]]; then |
|
| 57 |
+ rm -rf $SERVICE_DIR/$SCREEN_NAME |
|
| 58 |
+ mkdir -p $SERVICE_DIR/$SCREEN_NAME |
|
| 59 |
+fi |
|
| 60 |
+ |
|
| 61 |
+if [[ "$USE_SCREEN" == "True" ]]; then |
|
| 62 |
+ # Create a new named screen to run processes in |
|
| 63 |
+ screen -d -m -S $SCREEN_NAME -t shell -s /bin/bash |
|
| 64 |
+ sleep 1 |
|
| 65 |
+ |
|
| 66 |
+ # Set a reasonable status bar |
|
| 67 |
+ if [ -z "$SCREEN_HARDSTATUS" ]; then |
|
| 68 |
+ SCREEN_HARDSTATUS='%{= .} %-Lw%{= .}%> %n%f %t*%{= .}%+Lw%< %-=%{g}(%{d}%H/%l%{g})'
|
|
| 69 |
+ fi |
|
| 70 |
+ screen -r $SCREEN_NAME -X hardstatus alwayslastline "$SCREEN_HARDSTATUS" |
|
| 71 |
+fi |
|
| 72 |
+ |
|
| 73 |
+# Clear screen rc file |
|
| 74 |
+SCREENRC=$TOP_DIR/tests/$SCREEN_NAME-screenrc |
|
| 75 |
+if [[ -e $SCREENRC ]]; then |
|
| 76 |
+ echo -n > $SCREENRC |
|
| 77 |
+fi |
|
| 78 |
+} |
|
| 79 |
+ |
|
| 80 |
+# Mimic logging |
|
| 81 |
+ # Set up output redirection without log files |
|
| 82 |
+ # Copy stdout to fd 3 |
|
| 83 |
+ exec 3>&1 |
|
| 84 |
+ if [[ "$VERBOSE" != "True" ]]; then |
|
| 85 |
+ # Throw away stdout and stderr |
|
| 86 |
+ #exec 1>/dev/null 2>&1 |
|
| 87 |
+ : |
|
| 88 |
+ fi |
|
| 89 |
+ # Always send summary fd to original stdout |
|
| 90 |
+ exec 6>&3 |
|
| 91 |
+ |
|
| 92 |
+ |
|
| 93 |
+if [[ "$1" == "start" ]]; then |
|
| 94 |
+ echo "Start service" |
|
| 95 |
+ setup_screen |
|
| 96 |
+ screen_it fake-service "$TOP_DIR/tests/fake-service.sh" |
|
| 97 |
+ sleep 1 |
|
| 98 |
+ status |
|
| 99 |
+elif [[ "$1" == "stop" ]]; then |
|
| 100 |
+ echo "Stop service" |
|
| 101 |
+ screen_stop fake-service |
|
| 102 |
+ status |
|
| 103 |
+elif [[ "$1" == "status" ]]; then |
|
| 104 |
+ status |
|
| 105 |
+else |
|
| 106 |
+ echo "Unknown command" |
|
| 107 |
+ exit 1 |
|
| 108 |
+fi |