Skip to content

Instantly share code, notes, and snippets.

@asux
Created January 25, 2011 13:09
Show Gist options
  • Save asux/794882 to your computer and use it in GitHub Desktop.
Save asux/794882 to your computer and use it in GitHub Desktop.
This BASH script for Rails project. It runs MySQL embedded server (mysql server must be compiled with embedded feature). It must by under $RAILS_ROOT/script directory Author: Alexander Ulyanitsky <a.ulyanitsky@gmail.com> License: Rails (BSD)
#!/bin/sh
# This BASH script for Rails project.
# It runs MySQL embedded server.
# It must by under $RAILS_ROOT/script directory.
# Author: Alexander Ulyanitsky <a.ulyanitsky@gmail.com>.
# License: Rails (BSD).
case $(uname -s) in
Linux) gnu_readlink_bin="readlink";;
FreeBSD) gnu_readlink_bin="greadlink";;
*) echo "Can't determine GNU readlink utility" >&2; exit 11;;
esac
MYSQLD_BIN="/usr/sbin/mysqld"
RAILS_ROOT=$(${gnu_readlink_bin} -f $(dirname $(${gnu_readlink_bin} -f $0))/..)
MYSQL_CONFIG="${RAILS_ROOT}/config/mysql.conf"
MYSQL_DATA="${RAILS_ROOT}/db/mysql_data"
MYSQL_SOCKET="${RAILS_ROOT}/tmp/sockets/mysql.socket"
MYSQLD_PID_FILE="${RAILS_ROOT}/tmp/pids/mysql.pid"
print_help() {
cat >&1 <<HERE
Usage:
$0 [options] start|stop|restart
options is:
-b mysqld Path to mysqld binary (default: /usr/sbin/mysqld)
-c mysql.conf Path to MySQL config file (default: \$RAILS_ROOT/config/mysql.conf)
-d mysql_data Path to MySQL datadir (default \$RAILS_ROOT/db/mysql_data)
-s mysql.socket Path to MySQL socket (default: \$RAILS_ROOT/tmp/sockets/mysql.socket)
-p mysql.pid Path to MySQL pidfile (default: \$RAILS_ROOT/tmp/pids/mysql.pid)
-D Daemonize (default: false)
-v Be verbose (default: false)
-h Read this help
HERE
}
make_dirs() {
mkdir -p ${MYSQL_DATA} $(dirname ${MYSQL_CONFIG}) $(dirname ${MYSQL_SOCKET}) $(dirname ${MYSQLD_PID_FILE})
}
check_mysql_bin() {
[ ! -z $1 ] && MYSQLD_BIN=$1
if [ ! -x ${MYSQLD_BIN} ]; then
echo "mysqld binary not executable (${MYSQLD_BIN})" >&2
exit 1
fi
}
check_rails_root() {
if [ -z ${RAILS_ROOT} ]; then
echo "Rails root is empty string" >&2
exit 2
fi
if [ ! -d ${RAILS_ROOT} ]; then
echo "Rails root is not directory (${RAILS_ROOT})" >&2
exit 3
fi
[ -n "${VERBOSE}" ] && echo "Rails root is ${RAILS_ROOT}"
}
setup_mysql() {
if [ -n "${VERBOSE}" ]; then
echo "MySQL config is ${MYSQL_CONFIG}"
echo "MySQL data root is ${MYSQL_DATA}"
echo "MySQL socket is ${MYSQL_SOCKET}"
echo "MySQL pidfile is ${MYSQLD_PID_FILE}"
fi
if [ ! -f ${MYSQL_CONFIG} ]; then
if [ -f ${MYSQL_CONFIG}.example ]; then
cp ${MYSQL_CONFIG}.example ${MYSQL_CONFIG}
[ -n "${VERBOSE}" ] && echo "Coping config from example file"
else
echo "MySQL confg file not found (${MYSQL_CONFIG})" >&2
exit 4
fi
fi
if [ ! -d ${MYSQL_DATA} ]; then
echo "MySQL datadir is not directory" >&2
exit 6
fi
}
stop_server() {
if [ ! -f ${MYSQLD_PID_FILE} ] && [ ! -s ${MYSQL_SOCKET} ]; then
echo "Server not runned" >&2
fi
[ -f ${MYSQLD_PID_FILE} ] && MYSQLD_PID=$(cat ${MYSQLD_PID_FILE})
if [ -n "${MYSQLD_PID}" ]; then
[ -n "${VERBOSE}" ] && echo -n "Stopping server (PID ${MYSQLD_PID})"
kill -s TERM ${MYSQLD_PID}
while [ -f ${MYSQLD_PID_FILE} ]; do
[ -n "${VERBOSE}" ] && echo -n "."
sleep 0.1
done
[ -n "${VERBOSE}" ] && echo
fi
}
start_server() {
if [ -f ${MYSQLD_PID_FILE} ] || [ -s ${MYSQL_SOCKET} ]; then
echo "Server already runned" >&2
exit 7
fi
make_dirs
check_mysql_bin
check_rails_root
setup_mysql
[ -n "${VERBOSE}" ] && echo -n "Running embedded MySQL server"
${MYSQLD_BIN} --defaults-file=${MYSQL_CONFIG} --datadir=${MYSQL_DATA} --socket=${MYSQL_SOCKET} --pid-file=${MYSQLD_PID_FILE} &
if [ $? -eq 0 ]; then
while [ ! -f ${MYSQLD_PID_FILE} ]; do
echo -n "."
sleep 0.1
done
MYSQLD_PID=$(cat ${MYSQLD_PID_FILE})
[ -n "${VERBOSE}" ] && echo -e "\nMySQL server PID is ${MYSQLD_PID}"
if [ -z "${DAEMONIZE}" ]; then
echo "Interrupt to stop server"
trap "echo; stop_server" INT
wait %1
fi
fi
}
if [ $# -eq 0 ]; then
print_help
exit 10
fi
while getopts "b:c:d:s:p:Dvh" option; do
case ${option} in
b) MYSQLD_BIN=${OPTARG};;
c) MYSQL_CONFIG=${OPTARG};;
d) MYSQL_DATA=${OPTARG};;
s) MYSQL_SOCKET=${OPTARG};;
p) MYSQLD_PID_FILE=${OPTARG};;
D) DAEMONIZE="true";;
v) VERBOSE="true";;
h) print_help; exit 0;;
*) print_help; exit 10;;
esac
done
shift $(($OPTIND - 1))
CMD=$1
case ${CMD} in
start) start_server;;
stop) stop_server;;
restart) stop_server; start_server;;
*) print_help;;
esac
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment